Python 符号分隔函数覆盖传入列表,而不是返回新列表

Python 符号分隔函数覆盖传入列表,而不是返回新列表,python,Python,我正在编写一个函数,它接收一个包含正数和负数的数据集,并希望有两个函数将列表分为正数或负数,并用零替换不需要的数据集。但我的代码似乎覆盖了原来的列表 代码: 正如你所看到的,正函数起作用了,但负函数似乎从正函数得到了输入 当我先运行负函数,然后运行正函数时,我得到了完全相反的结果: 代码: 输出: original [1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8] positive [1, 0, 2, 0, 3, 0, 4, 0,

我正在编写一个函数,它接收一个包含正数和负数的数据集,并希望有两个函数将列表分为正数或负数,并用零替换不需要的数据集。但我的代码似乎覆盖了原来的列表

代码:

正如你所看到的,正函数起作用了,但负函数似乎从正函数得到了输入

当我先运行负函数,然后运行正函数时,我得到了完全相反的结果:

代码:

输出:

original
[1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8]
positive
[1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0]
negative
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
original
[1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8]
negative
[0, -1, 0, -2, 0, -3, 0, -4, 0, -5, 0, -6, 0, -7, 0, -8]
positive
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
守则:

new_list = old_list
不复制列表,而是创建指向同一列表的另一个名称。所以当你改变一个的时候,另一个也改变了。要复制列表,您应使用:

new_list = old_list[:]
例子
使用列表理解,您试图编写的内容很难实现:

>>> l = list(range(-10,10)) # python3
>>> l
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x if x > 0 else 0 for x in l]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x if x < 0 else 0 for x in l]
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>l=list(范围(-10,10))#蟒蛇3
>>>l
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>[x如果x>0,则为0表示l中的x]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>[x如果x<0,则l中的x为0]
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

它基于现有列表生成一个新列表。您所做的是为同一个列表创建一个新名称,
positive=data
,它不进行复制,因此您正在对现有列表进行操作。

虽然
old_list[:]
是复制列表的常用习惯用法,但更明确的选择是使用
list(old_list)
。除了更加清晰之外,这还适用于任何类型的iterable,而不仅仅是另一个列表。如果您想将函数应用于元组或字典的键(其中切片将返回不可变类型或引发异常),这可能很方便。我对这种语言还是很陌生。来自C++的很难理解。
new_list = old_list[:]
>>> old_list = [0, 0, 0]
>>> not_new_list = old_list     # another name for the same list
>>> not_new_list[0] = 1
>>> print old_list
[1, 0, 0]

>>> old_list = [0, 0, 0]
>>> new_list = old_list[:]      # the list is copied in new_list
>>> not_new_list[0] = 1
>>> print old_list
[0, 0, 0]
>>> l = list(range(-10,10)) # python3
>>> l
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x if x > 0 else 0 for x in l]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x if x < 0 else 0 for x in l]
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]