Aliarisingか、cloningか、それが問題だ。
aliasing happens whenever one variable’s value is assigned to another variable,
idを同じにする、同じobjectとみなすようにする操作をaliarisingという?
variable nameを変えるだけのaliasing, 別のobjectとして複製するcloning
a is b (a is an alias for b)はaとbのidが同じことを指す。
(idが異なる場合、別のobject。idが同じ場合、同じobjectとして見られている)?????
a == b (a is equivalent to b)はaとbのvalueが同じことを表す。(idが同じでなくとも、valueが同じなら成り立つ)
stringの場合、idという概念が役に立たないっぽい。
print(” stringではveriableに関わらず、同じvalueには同じidがassignされる”)
a0 = “banana”
b0 = “banana”
print(a0 is b0)
print(a0 == b0)
print(id(a0))
print(id(b0))
print(” A0 = a0[:]”)
A0 = a0[:]
print(a0 is A0)
print(a0 == A0)
print(id(a0))
print(id(A0))
print(id(a0.replace(“n”, “a”)))
print(id(A0.replace(“n”, “b”)))
print(” B0 = a0″)
B0 = b0
print(b0 is B0)
print(b0 == B0)
print(id(b0))
print(id(B0))
print(id(b0.replace(“n”, “a”)))
print(id(B0.replace(“n”, “b”)))
list, dictionaryの場合、複製と上書きの概念がある。
print(” listの場合、valueが同じでもvariableが違えばidが異なる”)
a0 = [81,82,83]
b0 = [81,82,83]
print(a0 is b0)
print(a0 == b0)
print(id(a0))
print(id(b0))
a0.append(90) #appendしてもid変わらない。
print(id(a0))
a0 = a0 + [92]
print(id(a0)) #a1 = a1 + [92]はid変わる。
a0 += [93]
print(id(a0)) #a1 += [92]はid変わらない。
print(a0)
print(b0)
print(” A1 = a1[:] cloningは異なるidをassignする。つまり片方はもう片方から影響を受けない。”)
a1 = [81,82,83]
A1 = a1[:] #別のidを付与する。
print(A1 is a1)
print(A1 == a1)
print(id(A1))
print(id(a1))
A1.append(90) #appendしてもid変わらない。
print(A1)
print(a1)
print(id(A1))
print(id(a1))
A1 = A1 + [92]
print(A1)
print(a1)
print(id(A1))
print(id(a1)) #a1 = a1 + [92]はid変わる。
A1 += [93]
print(A1)
print(a1)
print(id(A1))
print(id(a1)) #a1 += [92]はid変わらない。
print(” B1 = b1 aliasingは同じidをassignする。つまり片方はもう片方の影響を受ける”)
print(“append以外は影響受けていない。”)
b1 = [81,82,83]
B1 = b1 #同じidを付与する。
print(B1 is b1)
print(B1 == b1)
print(id(B1))
print(id(b1))#################B1とb1のidが同じになる。
B1.append(90) #appendしてもid変わらない上書きされる。
print(B1)
print(b1)#b1は.appendされていないが、idが同じなので影響を受ける。
print(id(B1))
print(id(b1))
B1 = B1 + [92]#a1 = a1 + [92]はid変わる複製される。
print(B1)
print(b1) #したがってb1はもはやB1から影響を受けない。
print(id(B1))
print(id(b1))
B1 += [93]
print(B1)
print(b1)
print(id(B1))
print(id(b1)) #a1 += [92]はid変わらない上書きされる。
listが nest level3持つときは、deepcopyしましょう。
print(“listが nest level3持つときは、deepcopyしましょう”)
import copy
original = [[‘canines’, [‘dogs’, ‘puppies’]],
[‘felines’, [‘cats’, ‘kittens’]]]
shallow_copy = original[:] #異なるidを付与。
deeply_copied = copy.deepcopy(original)#異なるidを付与。
print(id(original))
print(id(shallow_copy))
print(id(deeply_copied))
original.append(“Hi there”)
original[0].append([“marsupials”])
print(“——– 上書きされたOriginal ———–“)
print(original)
print(“——– deep copy / copy module は何も影響を受けない”)
print(deeply_copied)
print(“——– shallow copy / cloning with[:] はlist内のlistのlistでは影響を受けてしまう!??”)
print(shallow_copy)
dictionaryの場合。sliceできません。copyモジュールを使いましょう。
辞書はsliceにより複製できません。
idを変えて複製したいなら、copyモジュールを使いましょう。
print(” dictionaryの場合、valueが同じでもvariableが違えばidが異なる”)
print(“ いくら上書きしてもidは変わらない”)
a0 = {‘up’: ‘down’, ‘right’: ‘wrong’, ‘true’: ‘false’}
b0 = {‘up’: ‘down’, ‘right’: ‘wrong’, ‘true’: ‘false’}
print(a0 is b0) #valueが同じでもvariableが違えばidが異なる
print(a0 == b0) #valueは同じ
print(id(a0))
print(id(b0))
a0[“reject”] = “accept”
print(id(a0))
print(id(b0))
a0.clear()
print(id(a0))
print(id(b0))
print(” A0 = a0 aliasingは同じidを付与する”)
print(“ いくら上書きしてもidは変わらない”)
a0 = {‘up’: ‘down’, ‘right’: ‘wrong’, ‘true’: ‘false’}
A0 = a0
print(a0 is A0) #valueが同じでもvariableが違えばidが異なる
print(a0 == A0) #valueは同じ
print(id(a0))
print(id(A0))
a0[“reject”] = “accept”
print(id(a0))
print(id(A0))
a0.clear()
print(id(a0))
print(id(A0))
print(a0)
print(A0)
print(” .deepcopy()は異なるidを付与する”)
import copy
a0 = {‘up’: ‘down’, ‘right’: ‘wrong’, ‘true’: ‘false’}
A0 = copy.deepcopy(a0)
print(a0 is A0) #異なるidを付与。
print(a0 == A0) #valueは同じ
print(id(a0))
print(id(A0))
a0[“reject”] = “accept”
print(id(a0))
print(id(A0))
print(a0)
print(A0)
import copy
original = {“key1”: [‘canines’, [‘dogs’, ‘puppies’]],
“key2”: [‘felines’, [‘cats’, ‘kittens’]]}
deeply_copied = copy.deepcopy(original)#異なるidを付与。
print(id(original))
print(id(deeply_copied))
original[“Hi there”] = “Hello!”
original[“key1”][1][0] = “goooods”
print(“——– 上書きされたOriginal ———–“)
print(original)
print(“——– deep copy / copy module は何も影響を受けない”)
print(deeply_copied)
一度assignしたら、継続する。
aliarisingする時の注意。
sliceを使って複製した場合は、cloningされるがaliariseされない。
Append はid変えずに上書きする vs. Concatenate(plus operator)はid変わる?
immutable=上書きできない?dictionary, string, tuple
いやstringもreplaceできるでしょ。
accumulation?の注意事項 id変わるよ。
Concatenate(plus operator)でも、
object.append([list])だとid変わらない(上書き)
object = object + [list] だとid変わる(複製)
object += [list] だとid変わらない(上書き)。←listには使わないことを推奨されている。
list1 = [45,32,88]
print(id(list1))
list1.append("cat")
print(id(list1))
print(list1)
list2 = [45,32,88]
print(id(list2))
list2 = list2 + ["cat"]
print(id(list2))
print(list2)
list3 = [45,32,88]
print(id(list3))
list3 += ["cat"]
print(id(list3))
print(list3)
listにおいて
list = list + another はlistのidが変わる。
list += another はlistのid変わらない。
コメント