All technological notes.
Python 引用计数机制
命名空间
my_string = "Hello World!"指针
例子
my_list:my_list = ['string', 42]= and copy()print("\n--------original list--------")
a = ["string", 42]
print("a", a) # ["string", 42]
print("\n--------reference--------")
b = a
b[0] = "some words"
print("a", a) # ['some words', 42]
print("b", b) # ['some words', 42]
print("\n--------copy list--------")
c = a.copy()
c[0] = "hello!"
print("a", a) # ['some words', 42]
print("b", b) # ['some words', 42]
print("c", c) # ['hello!', 42]
a 之所以会发生改变,是因为 b = a 并没有创建一个新的列表,只是创建了一个新的指针 b,它与 a 指向了相同的列表。
使用 copy 方法
=引用使用相同的指针, 当 b 通过指针修改指向的元素时, 因为 a 的指针与 b 的指针相同, 所以 a 指向的元素也会受影响;copy()方法会生成新的指针, 当 c 修改指针指向的元素时,由于 c 与 a,b 的指针不相同, 所以 c 指向的元素不会影响 a, b.print("\n--------original list--------")
a = [["alex", "beth"]]
print("a", a) # a [['alex', 'beth']]
print("\n--------copy list--------")
b = a.copy()
b[0].append("charlie")
print("a", a) # a [['alex', 'beth', 'charlie']]
print("b", b) # b [['alex', 'beth', 'charlie']]
copy方法是浅拷贝。a[0]与 b[0]指向了同一个对象
a[0]和b[0]共同指向的, 该["alex", "beth"]在b[0]发生改变时, 也会影响到a[0]deepcopy() 函数print("\n--------deepcopy()--------")
from copy import deepcopy
a = [["alex", "beth"]]
c = deepcopy(a)
c[0].append("dan")
print('a', a) # a [['alex', 'beth']]
print('c', c) # c [['alex', 'beth', 'dan']]
c[0]修改指向对象时, 因为是深拷贝,指针和指向的对象都不同, 所以 a 与 c 不会发生影响.print("\n--------list--------")
b = [42, 'beeblebrox']
b[0] = 63
b[1] = 'beeble'
print(b) # [63, 'beeble']
print("\n--------tuple--------")
xVar = 'abc'
yVar = [0, 1]
a = (42, 'beeblebrox', xVar, [1, 2], yVar)
# a[0] = 63 # TypeError: 'tuple' object does not support item assignment
# a[1] = 'beeble' # TypeError: 'tuple' object does not support item assignment
# a[2] = 'beeble' # TypeError: 'tuple' object does not support item assignment
a[3].append(3)
xVar = 'xyz'
yVar.pop()
print(a) # (42, 'beeblebrox', 'abc', [1, 2, 3], [0])
列表的可变性
元组不可变
a[0], a[1]…a[0]、a[1]a[3]. 但不是通过改变指针, 而改变指向的元素(.append())可改变对象 / 不可改变对象
a[2]指向变量xVar, 该变量指向的是字符串, 不可改变对象. 所以当 xVar 的值改变为xyz时, a[2]依然指向abca[3]指向变量yVar, 变量指向的是列表, 可改变对象,所以当 yVar 的值改变时, a[3]的值也会改变.Immutable object
注意 Immutable 的是对象, 不是变量. 变量是指向对象的指针.指针可以改变, 但不可变对象一旦创建则不会改变.
print("\n--------Immutable--------")
xVar = 'abc'
print(id(xVar))
xVar = 'xyz'
print(id(xVar))
# 在内存中的地址不同, 显示xVar先后指向的不是相同的对象.
'abc'和'xyz'在内存中有不同的地址, 即 xVar 变量前后指向不同的对象