original_list = [Object1(), Object2(), Object3()]
copy_list = original_list
original_list.pop()
Run Code Online (Sandbox Code Playgroud)
如果我从原始列表中删除一个对象,我怎样才能保持副本列表不被更改?
原始清单
[<Object.Object instance at 0x00EA29E0>, <Object.Object instance at 0x00EA2DC8>, <Object.Object instance at 0x00EA2EE0>]
Run Code Online (Sandbox Code Playgroud)
弹出原始列表后复制列表(我希望它等于上面的内容)
[<Object.Object instance at 0x00EA29E0>, <Object.Object instance at 0x00EA2DC8>]
Run Code Online (Sandbox Code Playgroud) 注意:我是一名Ruby开发人员,试图在Python中找到自己的方式.
当我想弄清楚为什么有些脚本使用mylist[:]
而不是list(mylist)
复制列表时,我对各种复制方法进行了快速基准测试range(10)
(参见下面的代码).
编辑:我更新了测试以使用Python timeit
,如下所示.这使得无法直接将它与Ruby进行比较,因为timeit不考虑Ruby的循环Benchmark
,因此Ruby代码仅供参考.
Python 2.7.2
Array duplicating. Tests run 50000000 times
list(a) 18.7599430084
copy(a) 59.1787488461
a[:] 9.58828091621
a[0:len(a)] 14.9832749367
Run Code Online (Sandbox Code Playgroud)
作为参考,我也在Ruby中编写了相同的脚本:
Ruby 1.9.2p0
Array duplicating. Tests 50000000 times
user system total real
Array.new(a) 14.590000 0.030000 14.620000 ( 14.693033)
Array[*a] 18.840000 0.060000 18.900000 ( 19.156352)
a.take(a.size) 8.780000 0.020000 8.800000 ( 8.805700)
a.clone 16.310000 0.040000 16.350000 ( 16.384711)
a[0,a.size] 8.950000 0.020000 8.970000 ( 8.990514)
Run Code Online (Sandbox Code Playgroud)
问题1:什么是mylist[:]
不同的方式来做,这是 …
我有以下代码片段
classifier = NaiveBayesClassifier.train(train_data)
#classifier.show_most_informative_features(n=20)
results = classifier.classify(test_data)
Run Code Online (Sandbox Code Playgroud)
并且错误显示在以下行中
results = classifier.classify(test_data)
Run Code Online (Sandbox Code Playgroud)
错误:
Traceback (most recent call last):
File "trial_trial.py", line 46, in <module>
results = classifier.classify(test_data)
File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 88, in classify
return self.prob_classify(featureset).max()
File "c:\Users\Amr\Anaconda\lib\site-packages\nltk\classify\naivebayes.py", line 94, in prob_classify
featureset = featureset.copy()
AttributeError: 'list' object has no attribute 'copy'
Run Code Online (Sandbox Code Playgroud)
我想在python中扩展基类列表并添加复制函数,但我不是python的专家,我不知道如何解决这个问题.
我以为我知道Python直到今晚.做这样的事的正确方法是什么?这是我的代码:
a = ["one", "two", "three"]
b = a # here I want a complete copy that when b is changed, has absolutely no effect on a
b.append["four"]
print a # a now has "four" in it
Run Code Online (Sandbox Code Playgroud)
基本上我想知道,而不是b = a
步骤,我如何正确地制作列表或字典的副本,以便b
更改时a
不会随之改变?
我试图将正数列表转换为python 3.3.3中具有相同值的负数列表
例如[1,2,3]
转入[-1,-2,-3]
我有这个代码:
xamount=int(input("How much of x is there"))
integeramount=int(input("How much of the integer is there"))
a=1
lista=[]
while(a<=integeramount):
if(integeramount%a==0):
lista.extend([a])
a=a+1
listb=lista
print(listb)
[ -x for x in listb]
print(listb)
Run Code Online (Sandbox Code Playgroud)
当我希望一个为正,一个为负时,打印两个相同的列表.
我创建了一个以列表作为参数的函数.它会对列表进行洗牌,替换第一个元素并返回新列表.
import random
firstList=["a","b","c","d","e","f","g","h","i"]
def substitution(importedList):
random.shuffle(importedList)
importedList[0]="WORD"
return importedList
Run Code Online (Sandbox Code Playgroud)
洗牌对我的问题没有影响.但是,我很惊讶地看到返回的importedList覆盖了原始的firstList.
>>> firstList
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
>>> substitution(firstList)
['WORD', 'a', 'b', 'd', 'i', 'c', 'g', 'e', 'h']
>>> firstList
['WORD', 'a', 'b', 'd', 'i', 'c', 'g', 'e', 'h']
Run Code Online (Sandbox Code Playgroud)
我通过复制函数中的列表找到了一种解决方法,但它似乎效率低下.
import random
firstList=["a","b","c","d","e","f","g","h","i"]
string="a"
def substitutionandcopy(importedList):
copiedList=importedList[:]
random.shuffle(copiedList)
copiedList[0]="WORD"
return copiedList
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么函数替换firstList?如果它是例如字符串,则不会发生这种情况.
string="a"
def substituteString(foo):
foo='b'
return foo
Run Code Online (Sandbox Code Playgroud)
>>> string
'a'
>>> substituteString(string)
'b'
>>> string
'a'
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 python 中制作 numpy 数组的副本。然后我想更改新数组的一些值,但是不知何故这也改变了原始数组?
为什么下面的代码不正确?
import numpy as np
a = np.array([1,1])
print("Array a:",a)
b = a
b[0] = a[0]*2
print("Array b after manipulation:", b)
print("Array a, after manipulating array b", a)
Run Code Online (Sandbox Code Playgroud)
我可以让它发挥作用的唯一方法是通过列表理解。
import numpy as np
a = np.array([1,1])
print("Array a:",a)
b = [x for x in a]
b[0] = a[0]*2
print("Array b after manipulation:", b)
print("Array a, after manipulating array b", a)
Run Code Online (Sandbox Code Playgroud) 如果您的问题作为此问题的重复项而被关闭,那是因为您有一些通用形式的代码
x = X()
# later...
x = x.y()
# or:
x.y().z()
Run Code Online (Sandbox Code Playgroud)
其中X
是某种类型,它提供了y
旨在z
变异(修改)对象(X
类型的实例)的方法。这可以适用于:
list
、dict
和set
bytearray
这种形式的代码很常见,但并不总是错误的。问题的明显迹象是:
与x.y().z()
一样,会引发异常AttributeError: 'NoneType' object has no attribute 'z'
。
有了x = x.y()
,x
就变成None
, 而不是被修改的对象。这可能会被后来的错误结果发现,或者被像上面这样的异常(x.z()
稍后尝试时)发现。
Stack Overflow 上有大量关于这个问题的现有问题,所有这些问题实际上都是同一个问题。之前甚至有多次尝试在特定上下文中涵盖同一问题的规范。然而,理解问题并不需要上下文,因此这里尝试一般性地回答:
代码有什么问题吗?为什么这些方法会这样,我们如何解决这个问题?
另请注意,当尝试使用 alambda
(或列表理解)来产生副作用时,会出现类似的问题。
同样明显的问题可能是由因其他原因返回的方法引起的None …
在Python中,如果我复制列表或字典,则复制的实例等于原始实例:
>>> a = [1, 2, 3]
>>> b = copy.copy(a)
>>> a == b
True
>>> a = {"a":1, "b":2}
>>> b = copy.copy(a)
>>> a == b
True
Run Code Online (Sandbox Code Playgroud)
但是如果我复制一个对象,结果就不等于原始对象:
>>> class MyClass():
... def __init__(self, name):
... self._name= name
...
>>> a = MyClass('a')
>>> b = copy.copy(a)
>>> a == b
False
Run Code Online (Sandbox Code Playgroud)
为什么?
我有一个像这样的字符串
a = "X1+X2*X3*X1"
b = {"X1":"XX0","X2":"XX1","X0":"XX2"}
Run Code Online (Sandbox Code Playgroud)
我想使用 dict b 替换子字符串 'X1,X2,X3'。
但是,当我使用下面的代码替换时,
for x in b:
a = a.replace(x,b[x])
print(a)
Run Code Online (Sandbox Code Playgroud)
'XXX2+XX1*X3'
预期结果是 XX0 + XX1*X3*XX0
我知道这是因为子字符串在循环中被替换,但我不知道如何解决。