today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-02-05 - 破壊的・非破壊的

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

「破壊的処理・非破壊的処理」に関する記述は、以下の記事にもあります。

rapidliner0.hatenablog.com

非破壊的処理の例

def double(arg):
    print('実行前:', arg)
    print('実行前のオブジェクトID:', id(arg))
    arg = arg * 2
    print('実行後:', arg)
    print('実行後のオブジェクトID:', id(arg))

numbers = [ 42, 256, 16 ]
double(numbers)
# => 実行前: [42, 256, 16]
# => 実行前のオブジェクトID: 2133283073344
# => 実行後: [42, 256, 16, 42, 256, 16]
# => 実行後のオブジェクトID: 2133315161536

↑上述コードの特徴は以下。

  • 実行前と実行後でオブジェクトIDが異なる
    • [42, 256, 16, 42, 256, 16]というオブジェクトは、*演算を実行した際に新たに生成されたものである
  • *演算子による演算処理は非破壊的処理である
    • 元の[42, 256, 16]というオブジェクトそのものを書き換えるものではない

破壊的処理の例

def change(arg):
    print('実行前:', arg)
    print('実行前:', id(arg))
    arg.append('さらなるデータ')
    print('実行後:', arg)
    print('実行後のオブジェクトID:', id(arg))

numbers = [ 42, 256, 16 ]
change(numbers)
# => 実行前: [42, 256, 16]
# => 実行前: 2133283073344
# => 実行後: [42, 256, 16, 'さらなるデータ']
# => 実行後のオブジェクトID: 2133283073344
  • 実行前と実行後でオブジェクトIDが同じ
    • [42, 256, 16, 'さらなるデータ']というオブジェクトは、元の[42, 256, 16]というオブジェクトが上書きされたものである
  • リストのappend()メソッドによる処理は破壊的処理である
    • 元の[42, 256, 16]というオブジェクトそのものを書き換える