Python函数正在更改传递参数的值
这里有一个我开始的例子Python函数正在更改传递参数的值,python,parameter-passing,Python,Parameter Passing,这里有一个我开始的例子 mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]] def testfun(passedvariable): for row in passedvariable: row.append("Something else") return "Other answer" otheranswer = testfun(mylist) print mylist 我原以为我的列表
mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]]
def testfun(passedvariable):
for row in passedvariable:
row.append("Something else")
return "Other answer"
otheranswer = testfun(mylist)
print mylist
我原以为我的列表不会改变
然后,我尝试删除该临时列,但不起作用:
mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]]
def testfun(passedvariable):
for row in passedvariable:
row.append("Something else")
# I'm now finished with the "Something else" column, so remove it
for row in passedvariable: row = row[:-1]
return "Other answer"
otheranswer = testfun(mylist)
print mylist
我想尝试使用不同的参考:
mylist = [["1", "apple"], ["2", "banana"], ["3", "carrot"]]
def testfun(passedvariable):
copyofdata = passedvariable
for row in copyofdata:
row.append("Something else")
# I'm now finished with the "Something else" column, so remove it
for row in copyofdata: row = row[:-1]
return "Other answer"
otheranswer = testfun(mylist)
print mylist
我已经编写了几个月的小Python脚本,但以前从未遇到过这种情况。我需要了解什么,以及如何将列表传递给函数并临时操作它(但保留原始列表不变?)Python通过共享传递所有内容(引用作为值传递,请参见),但是集成的数字和字符串类型是不可变的,因此,如果更改它们,则会更改引用的值,而不是对象本身。对于列表等可变类型,制作一份副本(例如
list(passedvariable)
)。如果要修改列表中的可变对象(只能包含引用!),则需要执行深度复制,为此,请使用
import copy
copy.deepcopy(passedvariable)
请参阅(从Python 2.6开始提供)
请注意,由于引用本身是通过值传递的,因此不能将作为参数传递的引用更改为指向函数外部的其他对象(即passedvariable=passedvariable[1:]不会更改函数外部的值)。一个常见的技巧是传递一个包含一个元素的列表并更改该元素。Python通过共享传递所有内容(引用作为值传递,请参见),但是集成的数字和字符串类型是不可变的,因此如果您更改它们,则会更改引用的值而不是对象本身。对于列表等可变类型,制作一份副本(例如
list(passedvariable)
)。如果要修改列表中的可变对象(只能包含引用!),则需要执行深度复制,为此,请使用
import copy
copy.deepcopy(passedvariable)
请参阅(从Python 2.6开始提供)
请注意,由于引用本身是通过值传递的,因此不能将作为参数传递的引用更改为指向函数外部的其他对象(即passedvariable=passedvariable[1:]不会更改函数外部的值)。一个常见的技巧是传递一个包含一个元素的列表并更改该元素。Python通过共享传递所有内容(引用作为值传递,请参见),但是集成的数字和字符串类型是不可变的,因此如果您更改它们,则会更改引用的值而不是对象本身。对于列表等可变类型,制作一份副本(例如
list(passedvariable)
)。如果要修改列表中的可变对象(只能包含引用!),则需要执行深度复制,为此,请使用
import copy
copy.deepcopy(passedvariable)
请参阅(从Python 2.6开始提供)
请注意,由于引用本身是通过值传递的,因此不能将作为参数传递的引用更改为指向函数外部的其他对象(即passedvariable=passedvariable[1:]不会更改函数外部的值)。一个常见的技巧是传递一个包含一个元素的列表并更改该元素。Python通过共享传递所有内容(引用作为值传递,请参见),但是集成的数字和字符串类型是不可变的,因此如果您更改它们,则会更改引用的值而不是对象本身。对于列表等可变类型,制作一份副本(例如
list(passedvariable)
)。如果要修改列表中的可变对象(只能包含引用!),则需要执行深度复制,为此,请使用
import copy
copy.deepcopy(passedvariable)
请参阅(从Python 2.6开始提供)
请注意,由于引用本身是通过值传递的,因此不能将作为参数传递的引用更改为指向函数外部的其他对象(即passedvariable=passedvariable[1:]不会更改函数外部的值)。一个常见的技巧是传递一个包含一个元素的列表并更改该元素。
mylist
函数外部和passedvariable
是相同的列表对象。因此,改变名单到处都能反映出来。第三个示例中的copyofdata
也是如此。它不是副本,而是相同的列表对象。要进行复制,必须显式复制列表,在这种情况下,甚至必须复制列表的每个元素,因为它们也是列表对象。
现在来看第二个示例
row=row[:-1]
:这里您复制了列表,但最后一个元素除外。因此,前面的行
不会更改,但新的列表对象绑定在函数外部的同名行
mylist
,并且passedvariable
是相同的列表对象。因此,改变名单到处都能反映出来。第三个示例中的copyofdata
也是如此。它不是副本,而是相同的列表对象。要进行复制,必须显式复制列表,在这种情况下,甚至必须复制列表的每个元素,因为它们也是列表对象。
现在来看第二个示例
row=row[:-1]
:这里您复制了列表,但最后一个元素除外。因此,前面的行
不会更改,但新的列表对象绑定在函数外部的同名行
mylist
,并且passedvariable
是相同的列表对象。因此,改变名单到处都能反映出来。第三个示例中的copyofdata
也是如此。它不是副本,而是相同的列表对象。要进行复制,必须显式复制列表,在这种情况下,甚至必须复制列表的每个元素,因为它们也是列表对象。
现在来看第二个示例
row=row[:-1]
:这里您复制了列表,但最后一个元素除外。因此,前面的行
不会更改,但新的列表对象绑定在函数外部的同名行
mylist
,并且passedvariable
是相同的列表对象。因此,改变名单到处都能反映出来。这同样适用于copyofdata