gpt4 book ai didi

Python 引用调用问题

转载 作者:行者123 更新时间:2023-12-01 03:49:28 26 4
gpt4 key购买 nike

正如我对 python 的理解,当你在函数参数上传递变量时,它已经是对原始变量的引用。在我的实现中,当我尝试将传递给函数的变量等同时,它会导致空列表。

这是我的代码:

#on the main -------------
temp_obj = []
obj = [
{'name':'a1', 'level':0},
{'name':'a2', 'level':0},
{'name':'a3', 'level':1},
{'name':'a4', 'level':1},
{'name':'a5', 'level':2},
{'name':'a6', 'level':2},
]

the_result = myFunction(obj, temp_obj)

print(temp_obj)
#above print would result to an empty list
#this is my problem

#end of main body -------------


def myFunction(obj, new_temp_obj):
inside_list = []
for x in obj[:]:
if x['level'] == 0:
inside_list.append(x)
obj.remove(x) #removing the element that was added to the inside_list

new_temp_obj = obj[:] #copying the remaining element

print(new_temp_obj)
# the above print would result to
#[{'name': 'a3', 'level': 1}, {'name': 'a4', 'level': 1}, {'name': 'a5', 'level': 2}, {'name': 'a6', 'level': 2}]

return inside_list

我是否遗漏了什么或者我是否误解了 python 通过引用调用的想法?

最佳答案

Python 不是按引用传递的。它是传递对象。

考虑以下两个函数:

def f(mylist):
mylist = []

def g(mylist):
mylist.append(1)

现在假设我给他们打电话。

mylist = [1]
f(mylist)
print(mylist)

mylist = [1] # reset the list
g(mylist)
print(mylist)

输出是什么?

如果Python是按值传递,函数将获取列表的副本,因此一旦从函数返回,修改它就不会影响原始列表。因此,在这两种情况下,您都将打印原始列表 [1]

如果Python是按引用传递,函数将接受对对象的引用,并且修改它会修改引用引用的实际对象,因此第一个输出将是 [] 和第二个 [1,2]

如果运行此示例,您会发现第一个输出是 [1] (列表,如果不受影响),第二个输出是 [1,2] (该列表受到影响)。

O_O

当您执行 new_temp_obj = obj[:] 时,Python 将构造一个对象 obj[:] 并为其命名 new_temp_obj

如果您要append,Python 会查找名为new_temp_obj 的内容并向其中添加元素。您传入的参数告诉它在哪里查找列表。

您正在内存中全新的位置创建一个全新的对象,并简单地为其指定相同的名称,new_temp_obj

关于Python 引用调用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38471306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com