相关疑难解决方法(0)

Python范围/静态误解

我真的坚持为什么下面的代码块1导致输出1而不是输出2?

代码块1:

class FruitContainer:
       def __init__(self,arr=[]):
           self.array = arr
       def addTo(self,something):
           self.array.append(something)
       def __str__(self):
           ret = "["
           for item in self.array:
               ret = "%s%s," % (ret,item)
           return "%s]" % ret

arrayOfFruit = ['apple', 'banana', 'pear']
arrayOfFruitContainers = []

while len(arrayOfFruit) > 0:
   tempFruit = arrayOfFruit.pop(0)
   tempB = FruitContainer()
   tempB.addTo(tempFruit)
   arrayOfFruitContainers.append(tempB)

for container in arrayOfFruitContainers:
   print container 

**Output 1 (actual):**
[apple,banana,pear,]
[apple,banana,pear,]
[apple,banana,pear,]

**Output 2 (desired):**
[apple,]
[banana,]
[pear,]
Run Code Online (Sandbox Code Playgroud)

此代码的目标是迭代数组并将每个数据包装在父对象中.这是我的实际代码的减少,它将所有苹果添加到一袋苹果等等.我的猜测是,出于某种原因,它要么使用相同的对象,要么就像水果容器使用静态数组一样.我不知道如何解决这个问题.

python iteration scope class static-members

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

为什么通过python默认变量初始化变量会在对象实例化中保持状态?

我今天遇到了一个有趣的python bug,其中实例化一个类似乎反复出现状态.在以后的实例化调用中,已经定义了变量.

我将问题归结为以下类/ shell交互.我意识到这不是初始化类变量的最佳方法,但它肯定不应该像这样.这是一个真正的错误还是这个"功能"?:d

tester.py:

class Tester():
        def __init__(self):
                self.mydict = self.test()

        def test(self,out={}):
                key = "key"
                for i in ['a','b','c','d']:
                        if key in out:
                                out[key] += ','+i
                        else:   
                                out[key] = i 
                return out

Python提示:

Python 2.6.6 (r266:84292, Oct  6 2010, 00:44:09) 
[GCC 4.2.1 (Apple Inc. build 5664)] on darwin
>>> import tester
>>> t = tester.Tester()
>>> print t.mydict
{'key': 'a,b,c,d'}
>>> t2 = tester.Tester()
>>> print t2.mydict
{'key': 'a,b,c,d,a,b,c,d'}

python arguments

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

将列表传递给类python

我有这个简单的课程:

class revs:
    def __init__(self, rev, us, accs = []):
        self.rev = rev
        self.us = us
        self.accs = accs
Run Code Online (Sandbox Code Playgroud)

我有这段代码将值赋予列表并且在循环内部

rev, usu = cada_l.split("|")
acct = each_l[:2].strip()
list_acct.append(acct)
Run Code Online (Sandbox Code Playgroud)

最后,我创建了一个dict,来管理这样的转速列表:

drevs = {}
cada = revs(rev, us, list_acct)
drevs[cada.rev] = cada
Run Code Online (Sandbox Code Playgroud)

并且它与rev和我们一起正常工作,但是list_acct正在更新所有实例:

drevs['1'].rev
'1'
drevs['2'].rev
'2'
drevs['1'].us
'user1'
drevs['2'].us
'user2'
drevs['1'].accs
'["Doc1","Doc2"]'
drevs['2'].accs
'["Doc1","Doc2"]'
Run Code Online (Sandbox Code Playgroud)

如果我改变list_acct.clear(),所有实例中的值都是清楚的,我仍然是Python的新手,这让我很困惑.

谢谢

python python-3.x

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

Python内置异常使用

我相信你很清楚,python和大多数编程语言一样,都带有内置异常.我已经浏览了这个列表,并且不能推断哪个是合适的.当然我可以做出我自己的例外,但这是一个相当标准的错误,将被排除在外.

这是基于实例关系的错误.类的实例与其他一些实例相关.可以根据不同的连接进行计算.raise如果尝试对不相关的实例进行计算,则此错误将为d.

class Foo:
    def __init__(self,related=None):
        '''related is a list of Foo instances'''
        if related is not None:
            self.related = related
        else:
            self.related = []
    def compute(self,instance):
        if instance in self.related:
            #execute code
        else:
            raise SomeError("You cannot make a computation with an unrelated instance")
Run Code Online (Sandbox Code Playgroud)

我的想法

说实话,似乎ValueError最有意义,因为价值是不允许的,但由于某种原因,这并不能完全适合我.没有关系的事实是这个错误的重要性,而不仅仅是不允许尝试的值这一事实.

我的逻辑是否有比ValueError更好的异常?

注意:我知道这ValueError可能是正确的答案,但我很好奇是否有更精确的东西,当我浏览文档时,我可能无法看到它的连接.

python exception

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

Python类列表在类实例初始化时应该是空的,但事实并非如此.为什么?

我想创建一个类的实例,其中包含默认为空的列表; 而不是以后将此列表设置为最终完整列表,我想连续添加项目.这是一段示例代码,说明了这一点:

#!/usr/bin/python

class test:
    def __init__(self, lst=[], intg=0):
        self.lista   = lst
        self.integer = intg

name_dict = {}
counter   = 0

for name in ('Anne', 'Leo', 'Suzy'):
    counter += 1

    name_dict[name] = test()
    name_dict[name].integer += 1
    name_dict[name].lista.append(counter)

    print name, name_dict[name].integer, name_dict[name].lista
Run Code Online (Sandbox Code Playgroud)

当我运行上述程序时,我希望得到

安妮1 [1]
狮子座1 [2]
Suzy 1 [3]

因为我假设lista总是初始化为空列表.

我得到的是这样的:

安妮1 [1]
狮子座1 [1,2]
Suzy 1 [1,2,3]

如果我更换self.lista = lstself.lista = []它工作正常,当我添加行就像name_dict[name].lista = []for循环.

为什么保留先前对象列表的内容,但它们的值integer不是?我对Python很陌生,所以如果有人可以向我指出我的想法/假设误入歧途,那将会很棒.

非常感谢您的回复.

python initialization list

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

从图表中扩展路径

我知道这种类型的结构有模块,但我喜欢并且更愿意自己了解事情是如何运作的.所以...我正在尝试从图形中扩展路径,例如: 图形:

g = dict(
    s=['a','d','s'],
    a=['s','d','b'],
    d=['s','a','e'],
    b=['a','e','c'],
    e=['d','b','f'],
    f=['e','g'],
    c=['b'],
    g=['f'])
Run Code Online (Sandbox Code Playgroud)

到目前为止,我可以看到给定节点的邻居:

def vecinosDe(n = ''):
    return g[n]
Run Code Online (Sandbox Code Playgroud)

我希望每次调用一个给定一个参数的函数时,一个图形节点,返回与给定参数相连的其他节点的列表.
然后输入给定,创建的相同列表到同一个函数,以返回连接到给定列表图节点的节点,并连续地返回到达'g'节点.
我也知道我需要检查连接到给定节点的节点是否有任何递归(循环).

这是我到目前为止的代码:

def expandir(n = '', lista = []):
    lista.append([n]) #or lista = lista + [n]?
    for v in g[n]:
        for i in range(len(lista)): #?
            lista[i].append(v)
    return lista
Run Code Online (Sandbox Code Playgroud)

这就是发生的事情,我知道这不好,哈哈.

>>> expandir('s')
[['s', 'd', 'a', 's']]
>>> expandir('d')
[['S', 'D', 'A', 'S', 'S', 'A', 'E'], ['D', 'S', 'A', 'E']]
Run Code Online (Sandbox Code Playgroud)

在第二个for循环中的代码的某些部分,我想我应该检查是否有一个节点等于我要扩展的节点,给定的节点.这是我被卡住的地方.
试试这个?

if n == v:  #?
Run Code Online (Sandbox Code Playgroud)

另外我认为这可能需要某种递归,对吧?但是我想要一些提示来继续拼图.:P

我应该返回列表,列表清单吗?......怎么样?:S有
什么提示吗?:)
提前谢谢

python graph

5
推荐指数
1
解决办法
672
查看次数

Python不可散列类型:“ OrderedDict”

我对以下概念并不陌生:

TypeError: unhashable type: 'OrderedDict'
Run Code Online (Sandbox Code Playgroud)

但是我不明白下面的代码行如何产生这样的堆栈跟踪。

89:     @staticmethod
90:     def diff(var1, var2, path=[], level=0, curpath=[]):
...
101:        elif isinstance(var1, list) and isinstance(var2, list):
102:            l1s = set(var1)
103:            l2s = set(var2)
104:            retlist = []

  File "myFile.py", line 102, in diff
    l1s = set(var1)
TypeError: unhashable type: 'OrderedDict'
Run Code Online (Sandbox Code Playgroud)

102上面的代码中的line怎么会抛出这样的异常?

python dictionary exception

5
推荐指数
1
解决办法
8810
查看次数

Python中默认参数的范围

我正在学习Python并遇到了一个我不太了解的例子.在官方教程中,给出了以下代码:

i = 5

def f(arg=i):
    print(arg)

i = 6
f()
Run Code Online (Sandbox Code Playgroud)

来自c ++,直觉对我来说这将打印5.但我也想理解技术解释:"默认值在定义范围内的函数定义点进行评估." "定义范围"在这里意味着什么?

python parameters scope parameter-passing default-parameters

5
推荐指数
1
解决办法
174
查看次数

何时以及为什么要使用attr.Factory?

当我为什么要使用attr.ib(default=attr.Factory(list))attr.ib(default=[])

文档中我看到Factory用于生成一个新值,如果你使用带输入的lambda表达式,这是有意义的; 但是,如果您只是生成一个空列表,我不明白为什么要使用它.

我在这里错过了什么?

python python-3.x python-attrs

5
推荐指数
1
解决办法
1214
查看次数

递归函数如何在'for循环'中工作

我在'递归函数'中相当新.所以,我试图解决为什么我们使用递归函数以及递归函数如何工作,我想我对它有一个相当好的理解.

两天前,我试图解决最短路径问题.我有一个下面的图(它在python中):

 graph = {'a': ['b', 'c'],
             'b': ['c', 'd'],
             'c': ['d'],
             'd': ['c'],
             'e': ['f'],
             'f': ['c']}
Run Code Online (Sandbox Code Playgroud)

我只是想找到一条路,而不是最短路径.所以,这里是代码:

def find_path(graph,start,end,path=[]):
    path = path + [start]
    #Just a Test
    print(path)

    if start == end:
        return path

    if start not in graph:
        return None

    for node in graph[start]:
        if node not in path:
            new_path = find_path(graph,node,end,path)
        if new_path:
            #Just a test
            print(path)
            return new_path

print(find_path({'a':['b','c'],'b':['c','d'],'c':['d'],'d':['c'],'e':
['f'],'f':['c']},'a','d'))
Run Code Online (Sandbox Code Playgroud)

我的起始顶点是'a',结束顶点是'd'.

在第四行中,我只是打印了"路径"以查看路径的位置.

在第17行,我还打印了"路径",再次进行测试.这是结果:

['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['a', 'b', …
Run Code Online (Sandbox Code Playgroud)

python recursion loops

5
推荐指数
1
解决办法
269
查看次数