Python中的引用如何工作?

时间:2017-11-06 06:34:49

标签: python-3.x

请在第一次调用函数时解释代码跟随调用的方式。但是当第二次调用函数时,它不会遵循相同的。

##functions 
num = [0,1,2,3,4]

def first(num1):
    num1.append([5, 6]);
    print(num1)

def second(num1):
    num1 = num1 + [7, 8];
    print(num1)

print(num)
first(num)
print(num)
second(num)
print(num)

2 个答案:

答案 0 :(得分:1)

first中,参数通过引用传递,并使用该引用在函数内部进行修改。

second中,使用了名称num1,但也分配了一个新值。 num1绑定到一个新值,这不会改变传入的原始值。

答案 1 :(得分:0)

在第一种方法中,您将列表附加到num1,该列表基本上指向该点的num,因此基本上它指的是相同的位置,而在第二种方法中,您将向num1添加列表以创建新位置。 通过使用函数id()可以更好地理解,它基本上为每个对象提供唯一的整数值。

##functions 
num = [0,1,2,3,4]

def first(num1):
    print(id(num1)) # obj reference
    num1.append([5, 6]);
    print(id(num1))
    print(num1)

def second(num1):
    print(id(num1))
    num1 = num1 + [7, 8];
    print(id(num1))
    print(num1)

print(num)
first(num)
print(num)
second(num)
print(num)

如果运行上面的代码,你会发现在操作前后的第一个方法中对象引用是相同的,而在第二个方法中它是不同的。

输出:

[0, 1, 2, 3, 4]
140360682379784
140360682379784
[0, 1, 2, 3, 4, [5, 6]]
[0, 1, 2, 3, 4, [5, 6]]
140360682379784 
140360672905160
[0, 1, 2, 3, 4, [5, 6], 7, 8]
[0, 1, 2, 3, 4, [5, 6]]

本文也将帮助您更好地理解按值调用的概念,并在python中通过引用调用。 Is Python call-by-value or call-by-reference? Neither

您可以在此处尝试代码:Code