相关疑难解决方法(0)

重复调用时,python函数返回不同的结果

当我运行下面的python代码时,

def main():
    #print prime_factors(10)
    print prime_factors(9)

def prime_factors(n, i=2, factors=[]):
    if n==1:
        return factors
    if(n%i==0):
        factors.append(i)
        n = n/i
        return prime_factors(n, i, factors)
    else:
        return prime_factors(n, i+1, factors)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

它返回预期结果,返回9的素数因子:

[3, 3]
Run Code Online (Sandbox Code Playgroud)

如果我从第2行"print prime_factors(10)"中删除注释,就会发生一些奇怪的事情.对于10,一切都很好,但对于9,它不仅包含9的素数因子,而且包含10的素数因子:

[2, 5]
[2, 5, 3, 3]
Run Code Online (Sandbox Code Playgroud)

如果我用两个可选参数调用该函数

def main():
    print prime_factors(10, i=2, factors[])
    print prime_factors(9, i=2, factors[])
Run Code Online (Sandbox Code Playgroud)

一切正常.

[2,5]
[3,3]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么.我怀疑这是范围的一些问题,但我只是不明白:-(任何帮助将不胜感激.

python

3
推荐指数
1
解决办法
165
查看次数

如何通过最佳匹配(difflib比率)对字符串列表进行排序

让我们说我正在建立各种各样的基本搜索引擎.我有一个字符串列表作为搜索结果,我想在顶部订购具有最佳匹配结果的搜索结果列表.

我当前的代码看起来像这样(命名参数作为示例)

import difflib
def order_by_best_match(search_results=["spam", "eggs", "spammy", "eggy"], search_query="spam"):

    for result in search_results:
        ratio = difflib.SequenceMatcher(None, result, search_query).ratio()
Run Code Online (Sandbox Code Playgroud)

之后我不知道该怎么办ratio.我知道我必须对列表进行排序ratio,但我该怎么做呢?

python sorting list difflib

3
推荐指数
1
解决办法
3905
查看次数

SQLAlchemy在模型中自定义本地属性

我定义了一个简单的模型,并在类中添加了一些非SQL相关的属性.

如果属性是int或string类型的东西正在工作.但如果它是字典或列表类型,那么神奇地在模型类的所有不同实例上使用相同的列表.

例:

# Sample model class
class TestClass(Base):
   # SQL Mappings   
   __tablename__ = 'test1'

   pid = Column("id", Integer, primary_key=True)
   name = Column('name', String)

   # Non SQL related attributes
   works_var = 0
   works_not_var = []
   # ...
Run Code Online (Sandbox Code Playgroud)

在查询处理检索到的TestClass实例之后的其他地方

my_test_class.works_not_var.append("testval1")
my_test_class2.works_not_var.append("testval2")
Run Code Online (Sandbox Code Playgroud)

不知何故,两个附加值最终都在同一个列表中:

print id(my_test_class.works_not_var)
print id(my_test_class2.works_not.var)
Run Code Online (Sandbox Code Playgroud)

我的是一样的.但它适用于"works_var".我有不同的.

python scope sqlalchemy

3
推荐指数
1
解决办法
2673
查看次数

Python函数:可选参数计算一次?

Python教程4.7.1.默认参数值表示以下内容:

重要警告:默认值仅评估一次.当默认值是可变对象(如列表,字典或大多数类的实例)时,这会有所不同.例如,以下函数累积在后续调用中传递给它的参数:

def f(a, L=[]):
    L.append(a)
    return L

print f(1)
print f(2)
print f(3)
Run Code Online (Sandbox Code Playgroud)

这将打印

[1]
[1, 2]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

在内存管理方面,我不太明白"仅评估一次"的含义.显然,函数的默认值在首次调用函数时被计算一次,并且即使在函数结束后也存储在单独的存储器地址中.(根据我的理解,在函数结束后,应该释放所有局部变量?)

我对么?

python

3
推荐指数
1
解决办法
589
查看次数

列出Python函数定义中的构建

我想建立一个原型:

def foo(a,t=([0]*len(a))):
  print t
Run Code Online (Sandbox Code Playgroud)

由于目前不重要的原因.我传入的是可变长度列表参数.但是,Linux上的Python 2.7.10总是返回如下:

>>> a = [1,2,3,4]
>>> foo(a)
[O, 0]
Run Code Online (Sandbox Code Playgroud)

没有函数调用,这些都不会以意外的方式运行.是什么导致Python总是认为在foo()中的变量赋值期间传递的列表是长度为2?

python kwargs function-declaration python-2.7

3
推荐指数
1
解决办法
51
查看次数

Python:在无限循环函数内仅运行一次代码段..?

我有一个正在一遍又一遍地运行的函数。在该函数内部,我希望仅在该函数第一次运行时运行特定的段。

我不能使用函数外部的任何变量,例如

    firstTime = True

    myFunction(firstTime): #function is inside a loop
        if firstTime == True:
            #code I want to run only once
            firstTime = False
        #code I want to be run over and over again
Run Code Online (Sandbox Code Playgroud)

我也不想使用全局变量。

有什么想法如何实现这一点?

python loops function python-3.x

3
推荐指数
1
解决办法
8557
查看次数

在Python中,为什么没有内置函数来在嵌套字典中查找键?

详细说明

sample_dict = {"key1" : {"key2" : "value_of_interest}}
Run Code Online (Sandbox Code Playgroud)

现在我希望能够进行以下调用

val = sample_dict.recursive_get("key2", None)
Run Code Online (Sandbox Code Playgroud)

我可以想到一些有用的案例.例如,从作为JSON的api响应中获取键值.

而且我知道写这样一个函数并不困难,但我的问题是 - 为什么它还没有包括在内?

如果它导致糟糕的设计,请提供一些示例.

python dictionary

3
推荐指数
1
解决办法
82
查看次数

为什么用不同的参数打印一个函数两次更改输出:python

def f(x, arr=[]):
    arr.append(x)
    return arr
print(f(1),f(2))

o/p: [1,2] [1,2]

def f(x, arr=[]):
    arr.append(x)
    return arr
print(f(1))
print(f(2))

o/p: [1]
     [1,2]
Run Code Online (Sandbox Code Playgroud)

为什么以不同方式调用函数f()会改变输出值?我编写第二个函数只是为了与第一个函数进行比较.对不起,如果这造成了混乱.

python

3
推荐指数
1
解决办法
63
查看次数

它有内存泄漏吗?

我最近阅读了objgraph文档,我对以下代码感到困惑

>>> class MyBigFatObject(object):
...     pass
...
>>> def computate_something(_cache={}):
...     _cache[42] = dict(foo=MyBigFatObject(),
...                       bar=MyBigFatObject())
...     # a very explicit and easy-to-find "leak" but oh well
...     x = MyBigFatObject() # this one doesn't leak
Run Code Online (Sandbox Code Playgroud)

它表明"非常明显且容易找到'泄漏'".这有内存泄漏吗?这是dict _cache吗?

python memory-leaks objgraph

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

为什么在python中共享列表而不是变量(类级别)

class abc :
    x = 10
    list = []   
    def __init__(self):
        self.a = 30      
        self.b = 40

a = abc()
b = abc()
a.x = a.x + 1
print a.x
print b.x
a.list.append(1)
print b.list   

Output :
10
11
[1]
Run Code Online (Sandbox Code Playgroud)

所以我们看到它x不是跨对象共享的a,b而是list共享的.有人可以解释这种行为吗?

所以它的答案似乎在于列表是可变的objs而数字不是:

class abc :
   x = 10
   m_list = []

   def __init__(self):
       self.a = 30      
       self.b = 40



a = abc()
b = abc()
print id(a.x)
a.x = a.x + 1 …
Run Code Online (Sandbox Code Playgroud)

python oop

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