变量赋值
python中,变量是对象的引用。变量赋值,即将变量指向值对象,对值对象的引用。
值对象的分类:
- 不可变对象
- 可变对象
值对象为不可变对象
不可变对象,通俗的讲,就是不可以改变对象的内容。比如:数字,字符串,元祖tuple。
变量指向的值对象不可变,但变量的指向可变,即可以改为指向新的值对象。
1. 值对象为数字
a = 10
b = a
print("a addr: 0x%x val: %d" % (id(a), a))
print("b addr: 0x%x val: %d" % (id(b), b))
print("-"*30)
a = 100
print("a addr: 0x%x val: %d" % (id(a), a))
print("b addr: 0x%x val: %d" % (id(b), b)
代码输出:
a addr: 0x7ffb45d47d60 val: 10
b addr: 0x7ffb45d47d60 val: 10
------------------------------
a addr: 0x7ffb45d488a0 val: 100
b addr: 0x7ffb45d47d60 val: 10
2. 值对象为字符串
a = "hello"
b = a
print("a addr: 0x%x val: %s" % (id(a), a))
print("b addr: 0x%x val: %s" % (id(b), b))
print("-"*30)
a += " python!"
print("a addr: 0x%x val: %s" % (id(a), a))
print("b addr: 0x%x val: %s" % (id(b), b)
代码输出:
a addr: 0x1dd1cdb71b0 val: hello
b addr: 0x1dd1cdb71b0 val: hello
------------------------------
a addr: 0x1dd1cfb62b0 val: hello python!
b addr: 0x1dd1cdb71b0 val: hello
3. 值对象为tuple
a = (1, 2)
print("a addr: 0x%x val: %s" % (id(a), a))
print("-"*35)
b = (1, 2)
print("b addr: 0x%x val: %s" % (id(b), b))
print("-"*35)
a = (3, 4)
print("a addr: 0x%x val: %s" % (id(a), a))
代码输出:
a addr: 0x2af983d7988 val: (1, 2)
-----------------------------------
b addr: 0x2af983d7988 val: (1, 2)
-----------------------------------
a addr: 0x2af985e7948 val: (3, 4)
值对象为可变对象
值对象内容可变,比如:列表list,字典dict和集合set。
修改值对象的内容,所有引用当前值对象的变量,都可见修改。
1. 列表
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print("addr a=0x%x b=0x%x c=0x%x" % (id(a), id(b), id(c)))
print("-"*30)
c[0] = 4
print(f"a={a}")
print(f"b={b}")
print(f"c={c}")
代码输出:
addr a=0x2b2780d5208 b=0x2b2780d5408 c=0x2b2780d5208
------------------------------
a=[4, 2, 3]
b=[1, 2, 3]
c=[4, 2, 3]
2. 字典
a = {"m": 0, "n": 1}
b = {"m": 0, "n": 1}
c = a
print("addr a=0x%x b=0x%x c=0x%x" % (id(a), id(b), id(c)))
print("-"*30)
c["m"] = 4
print(f"a={a}")
print(f"b={b}")
print(f"c={c}")
代码输出:
addr a=0x20412912b88 b=0x20412912bd8 c=0x20412912b88
------------------------------
a={'m': 4, 'n': 1}
b={'m': 0, 'n': 1}
c={'m': 4, 'n': 1}
3. 集合
a = {1, 2, 3}
b = {1, 2, 3}
c = a
print("addr a=0x%x b=0x%x c=0x%x" % (id(a), id(b), id(c)))
print("-"*30)
c.remove(2)
print(f"a={a}")
print(f"b={b}")
print(f"c={c}")
代码输出:
addr a=0x1de10219908 b=0x1de1041eba8 c=0x1de10219908
------------------------------
a={1, 3}
b={1, 2, 3}
c={1, 3}