Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python函数正在更改传递参数的值_Python_Parameter Passing - Fatal编程技术网

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