Python 类属性问题,神奇的现象

class Test_a():
    t_a = ''
    t_b = 0

test_a = Test_a()
test_a.t_a = 'a'
test_b = Test_a()
test_b.t_a = 'b'

for test in [test_a, test_b]:
    if test.t_a == 'a':
        test.t_b = test.t_b + 10

print('test_a.t_b的值时{0}'.format(test_a.t_b))
print('test_b.t_b的值时{0}'.format(test_b.t_b))

class Test_1():
    t_1 = ''
    t_2 = [0,0]

test_1 = Test_1()
test_1.t_1 = '1'
test_2 = Test_1()
test_2.t_1 = '2'

for test in [test_1, test_2]:
    if test.t_1 == '1':
        test.t_2[0] = test.t_2[0] + 10


print('test_1.t_2[0]的值是{0}'.format(test_1.t_2[0]))
print('test_1.t_2[0]的值是{0}'.format(test_2.t_2[0]))


输出结果
test_a.t_b的值时10
test_b.t_b的值时0
test_1.t_2[0]的值是10
test_1.t_2[0]的值是10

类属性值为INT类型是可以单独计算, 类属性为列表时会合并计算

Jason990420
最佳答案

Python 引数传递采用的是 “传物件引用” 的方式,实际上,这种方式相当于传值和传址的一种综合。

如果函式收到的是一个可变物件(比如字典或者列表)的引用,就能修改物件的原始值 -- 相当于传址。如果函式收到的是一个不可变物件(比如数字、字元或者元组)的引用,就不能直接修改原始物件 -- 相当于传值。所以 python 的传值和传址是根据传入引数的型别来选择的。

传值的引数型别:数值,字符串,元组
传址的引数型别:列表,字典

def print_id(*arg):
    print(list(map(id, arg)))

a = 0
b = a
c = a + 0
d = a + 10
print_id(a, b, c, d)
# [140735774725760, 140735774725760, 140735774725760, 140735774726080]
# 前三者 a,b,c 同地址, 后者 d, 新地址

a = [0, 0]
b = a
print_id(a, b)
# [124497472, 124497472]
# a, b 同地址

b[0] = b[0] + 10
print(a, b)
# [10, 0] [10, 0]
# a, b 同地址, 所以同时变更内容

print_id(a, b)
[124497472, 124497472]
4年前 评论
讨论数量: 1
Jason990420

Python 引数传递采用的是 “传物件引用” 的方式,实际上,这种方式相当于传值和传址的一种综合。

如果函式收到的是一个可变物件(比如字典或者列表)的引用,就能修改物件的原始值 -- 相当于传址。如果函式收到的是一个不可变物件(比如数字、字元或者元组)的引用,就不能直接修改原始物件 -- 相当于传值。所以 python 的传值和传址是根据传入引数的型别来选择的。

传值的引数型别:数值,字符串,元组
传址的引数型别:列表,字典

def print_id(*arg):
    print(list(map(id, arg)))

a = 0
b = a
c = a + 0
d = a + 10
print_id(a, b, c, d)
# [140735774725760, 140735774725760, 140735774725760, 140735774726080]
# 前三者 a,b,c 同地址, 后者 d, 新地址

a = [0, 0]
b = a
print_id(a, b)
# [124497472, 124497472]
# a, b 同地址

b[0] = b[0] + 10
print(a, b)
# [10, 0] [10, 0]
# a, b 同地址, 所以同时变更内容

print_id(a, b)
[124497472, 124497472]
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!