Pythonを学ぶ上で、Pythonで渡されるパラメーターに疑問があります。それがコピーであるか参照アドレスであるかを知りたいので、テストを行います。
個人的な理解、誤りを指摘してください。
テスト
print("==========列表==========")
def listChanged(a): # 列表:同一引用
a[0] = 2
print(id(a))
a = [1]
print("调用函数前:" + str(a))
listChanged(a)
print(id(a))
print("调用函数后:" + str(a))
print("==========集合==========")
def setChanged(a): # 集合:同一引用
a.add(2)
print(id(a))
a = {
1}
print("调用函数前:" + str(a))
setChanged(a)
print(id(a))
print("调用函数后:" + str(a))
print("==========字典==========")
def dictChanged(a): # 字典:同一引用
a[1] = "2"
print(id(a))
a = {
1:"1"}
print("调用函数前:" + str(a))
dictChanged(a)
print(id(a))
print("调用函数后:" + str(a))
print("==========数值==========")
def numberChanged(a): # 数值:结果变成不同引用
print("调用函数时:", id(a))
a += 1
print("重新赋值:", id(a))
a = 1
print("调用函数前:" + str(a))
numberChanged(a)
print(id(a))
print("调用函数后:" + str(a))
print("==========字符串==========")
def stringChanged(a): # 字符串:结果变成不同引用
print("调用函数时:", id(a))
a += "a[:]" # 假装拷贝
print("重新赋值:", id(a))
a = "1"
print("调用函数前:" + str(a))
stringChanged(a)
print(id(a))
print("调用函数后:" + str(a))
print("==========元组==========")
def tupleChanged(a): # 元组:同一引用
print("调用函数时:", id(a))
a += ("合并两元组",)
print("重新赋值:", id(a))
a = ("1", "2")
print("调用函数前:" + str(a))
tupleChanged(a)
print(id(a))
print("调用函数后:" + str(a))
print("==========带可变子元素的元组==========")
def tuple2Changed(a): # 带可变子元素的元组:同一引用
a[1][0] = "22"
print(id(a))
a = ("1", ["2"])
print("调用函数前:" + str(a))
tuple2Changed(a)
print(id(a))
print("调用函数后:" + str(a))
取得する:
==========列表==========
调用函数前:[1]
2268560182080
2268560182080
调用函数后:[2]
==========集合==========
调用函数前:{
1}
2268560447296
2268560447296
调用函数后:{
1, 2}
==========字典==========
调用函数前:{
1: '1'}
2268560123776
2268560123776
调用函数后:{
1: '2'}
==========数值==========
调用函数前:1
调用函数时: 2268558420272
重新赋值: 2268558420304
2268558420272
调用函数后:1
==========字符串==========
调用函数前:1
调用函数时: 2268560076912
重新赋值: 2268560559408
2268560076912
调用函数后:1
==========元组==========
调用函数前:('1', '2')
调用函数时: 2268560166464
重新赋值: 2268560558592
2268560166464
调用函数后:('1', '2')
==========带可变子元素的元组==========
调用函数前:('1', ['2'])
2268560559232
2268560559232
调用函数后:('1', ['22'])
総括する
- パラメータとして渡される場合、渡されるメモリアドレスです。
- ただし、不変型は変更できないため、変更すると、新しいオブジェクトが作成され、メモリ内に新しいスペースが開かれます。関数での変更は、元の外部変数には影響しません。
- 変数型の転送では、オブジェクトが作成されないため、常に同じオブジェクトが関数の内外で操作されます。
- 不変型のタプルには[変数型のサブ要素]が含まれており、変数要素の変更は変数型のロジックに従います。つまり、可変サブオブジェクトを変更すると、再作成されず、このタプルは変更されません(メモリアドレスと格納されている要素のメモリアドレスが変更されていないか、変更されていないタプルオブジェクトがコンテンツが変更されていることを示します) 。
- 不変データ:数値(数値)、文字列(文字列)、タプル(タプル);
- 変数データ:リスト(リスト)、ディクショナリ(ディクショナリ)、セット(コレクション)。