相关疑难解决方法(0)

修改原始列表时如何制作对象列表的副本?

可能重复:
如何在python中克隆列表?
在Python中复制列表的最佳方法是什么?

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)

python list object

8
推荐指数
2
解决办法
2万
查看次数

在Python中复制数组/列表的有效方法

注意:我是一名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[:]不同的方式来做,这是 …

ruby python arrays

8
推荐指数
2
解决办法
817
查看次数

AttributeError:'list'对象没有属性'copy'

我有以下代码片段

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 list nltk

8
推荐指数
2
解决办法
3万
查看次数

Python对象混淆:a = b,修改b和更改!

我以为我知道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 variables reference

7
推荐指数
1
解决办法
4402
查看次数

如何将列表中的所有数字转换为负数?

我试图将正数列表转换为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)

当我希望一个为正,一个为负时,打印两个相同的列表.

python list negative-number python-3.x

7
推荐指数
2
解决办法
3万
查看次数

为什么我的函数会覆盖作为参数传递的列表?

我创建了一个以列表作为参数的函数.它会对列表进行洗牌,替换第一个元素并返回新列表.

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 arrays list

7
推荐指数
1
解决办法
1921
查看次数

在 python 中制作数组的副本

我正在尝试在 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)

python arrays

7
推荐指数
1
解决办法
1万
查看次数

在`x = xy()`之后,为什么`x`变成了`None`而不是被修改(可能导致“AttributeError:'NoneType'对象没有属性”)?

如果您的问题作为此问题的重复项而被关闭,那是因为您有一些通用形式的代码

x = X()
# later...
x = x.y()
# or:
x.y().z()
Run Code Online (Sandbox Code Playgroud)

其中X是某种类型,它提供了y旨在z变异修改)对象(X类型的实例)的方法。这可以适用于:

  • 可变的内置类型,例如listdictsetbytearray
  • 标准库(尤其是 Tkinter 小部件)或第三方库提供的类。

这种形式的代码很常见,但并不总是错误的。问题的明显迹象是:

  • x.y().z()一样,会引发异常AttributeError: 'NoneType' object has no attribute 'z'

  • 有了x = x.y(),x就变成None, 而不是被修改的对象。这可能会被后来的错误结果发现,或者被像上面这样的异常(x.z()稍后尝试时)发现。

Stack Overflow 上有大量关于这个问题的现有问题,所有这些问题实际上都是同一个问题。之前甚至有多次尝试在特定上下文中涵盖同一问题的规范。然而,理解问题并不需要上下文,因此这里尝试一般性地回答:

代码有什么问题吗?为什么这些方法会这样,我们如何解决这个问题?


另请注意,当尝试使用 alambda或列表理解)来产生副作用时,会出现类似的问题。

同样明显的问题可能是由因其他原因返回的方法引起的None …

python attributeerror command-query-separation nonetype

7
推荐指数
1
解决办法
577
查看次数

为什么Python的copy.copy()返回的对象不等于原始对象?

在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)

为什么?

python copy

6
推荐指数
1
解决办法
383
查看次数

如何同时替换多个子字符串

我有一个像这样的字符串

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

我知道这是因为子字符串在循环中被替换,但我不知道如何解决。

python substring

6
推荐指数
2
解决办法
547
查看次数