相关疑难解决方法(0)

Python静态函数?

在我的节目中遇到了这种奇怪.这是一个麻烦的部分片段:

#!/usr/bin python
def test_func( newList, myList=[] ):
    for t in newList:
        for f in t:
            myList.append(f)
    return myList

print test_func([[3, 4, 5], [6, 7, 8]])
print test_func([[9, 10, 11], [12, 13, 14]])
Run Code Online (Sandbox Code Playgroud)

第一次调用函数时,它会生成

[3, 4, 5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)

第二次

[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么会这样.python函数是静态的,因为它们保留了后续调用中传递给它们的值,或者我在代码中遗漏了什么?

python default-value

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

创建一个包含n个整数后跟整数的列表

我需要创建一个n个索引为1的列表,然后在一行代码中创建一个10(它必须在一行上在线提交).我试过:(n*[1]).append(10)但是返回一个None类型.这可行吗?谢谢.

python

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

与可变对象的默认参数相关的意外python行为

#! /usr/bin/python

class my_class:
    # 1. __init__
    def __init__(self):
        self.my_set = set()

    # 2. __init__
    #def __init__(self, arg_set = set()):
    #    self.my_set = arg_set 

c1 = my_class()
c1.my_set.add('a')

print c1.my_set

c2 = my_class()
c2.my_set.add('b')

print c1.my_set
Run Code Online (Sandbox Code Playgroud)

my_class有两种定义方式__init__:

如果我使用第一种方式,输出是预期的:
set(['a'])
set(['a'])

如果我使用第二种方式,输出是意外的:
set(['a'])
set(['a', 'b'])

第二种方式出了什么问题?如何修改C2(一个单独的对象),导致修改c1?

Edit: Updated the question title to reflect specific area of concern

python

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

递归函数返回值保留先前运行的结果

我有以下递归函数

def collatz(n,seq=[]):
    seq.append(n)
    if n == 1:
        return seq
    if n%2 == 0:
        return collatz(n/2, seq)
    else:
        return collatz((3*n)+1, seq)
Run Code Online (Sandbox Code Playgroud)

当我多次运行此函数时,seq仍然包含先前运行的值:

>>> collatz(1)
[1]                # correct
>>> collatz(2)
[1, 2, 1]          # should be [2,1]
>>> collatz(3)
[1, 2, 1, 3, 10, 5, 16, 8, 4, 2, 1]  # should be [3, 10, 5, 16, 8, 4, 2, 1]
Run Code Online (Sandbox Code Playgroud)

防止这种情况的方法是seq在调用时给出一个空列表collatz:

>>> collatz(3,seq=[])
[3, 10, 5, 16, 8, 4, 2, 1]
Run Code Online (Sandbox Code Playgroud)

有没有办法以collatz不同的方式写,以便我可以collatz(3)代替 …

python recursion return

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

是否可以创建具有相同输入的唯一实例?

我正在研究Python中的代码,它创建了由Bond和Element对象组成的Compound对象(如化合物).这些Element对象是通过一些关于它们的输入(名称,符号,原子序数,原子质量等)创建的.如果我想用Element对象填充数组,并且我希望Element对象是唯一的,那么我可以做一些事情并保持其余部分不变,但是它们都应该具有与'Hydrogen'元素相关的信息.

这个问题Python为单个对象/类创建多个实例让我相信我应该为Element创建子类 - 即Hydrogen对象和Carbon对象等.

这是否可以在不创建子类的情况下实现,如果是这样,怎么办?

python class object instance python-2.7

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

我的 eval 实现是完全安全的吗?

我有一个代码,其中我想,让用户通过标准输入三个值,每种类型的floatFraction或者int,所以我不能申请ast.literal_eval输入得到结果,我想要的。

我读到Eval 真的很危险,显示

  • eval提供意见的人如何利用弱点,以及
  • 一些如何使eval调用更安全的方法。

我应用了作者的建议并编写了此代码,替换了默认值eval

import builtins

class DoubleUnderscoreInEval(ValueError):
    pass

def eval(expression, globals={}, locals=None):
    if '__' in expression:
        raise DoubleUnderscoreInEval('Using __ in eval is not allowed for safety reasons.')
    else:
        if '__builtins__' not in globals:
            globals['__builtins__']={}
        return builtins.eval(expression, globals, locals)
Run Code Online (Sandbox Code Playgroud)

builtins.eval通过我的代码使用是否完全安全?
如果不是,我可以使eval调用完全安全吗?(鼓励绕过我的限制的字符串)
如果是,如何?如果不是,我可以用什么代替?

我是 Python 的初学者,所以鼓励任何告诉我如何改进我的代码的评论。

我在在线编译器中的整个代码

python eval python-3.x

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

Python方法只能工作一次

我正在编写一种计算2到8个时间序列变量的协方差的方法.我打算在将变量传递给此方法时将变量包含在列表对象中.该方法应返回1个数字,而不是协方差矩阵.

该方法在第一次调用时工作正常.在此之后调用它时,它返回0.示例附加在我的代码下方的底部.关于可变范围问题的任何建议/反馈都将非常感激.谢谢!

p = [3,4,4,654]
o = [4,67,4,1]

class Toolkit():
    def CovarianceScalar(self, column1, column2 = [], column3 = [], column4 = [],column5 = [],column6  = [],column7  = [],column8 = []):
    """Assumes all columns have length equal to Len(column1)"""
    #If only the first column is passed, this will act as a variance function
    import numpy as npObject
    #This is a binary-style number that is assigned a value of 1 if one of the input vectors/lists has zero length.  This way, the …
Run Code Online (Sandbox Code Playgroud)

python methods scope

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

使函数在第一次和后续调用之间表现不同

def download():
    upgrade = True
    if upgrade:
        # do a download using tftp
    else:
        # do a download via HTTP
Run Code Online (Sandbox Code Playgroud)

如您所见,我有一个设置为true的硬编码升级值.在此脚本中,它始终执行tftp下载.

如何在第一次迭代时更改脚本以执行tftp下载,在下一次迭代中调用函数下载时,它会进行http下载?

python

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

参数的 Python 类型可以是 None

我正在尝试使用 python 类型注释创建树结构。代码是这样的:

from typing import List

class TNode:
    def __init__(self, parent: 'TNode', data: str, children: List['TNode'] = []):
        self.parent = parent
        self.data = data
        self.children = children


root = TNode(None, 'example')
Run Code Online (Sandbox Code Playgroud)

但是代码存在类型不匹配的问题,Pycharm 会引发Expected type 'TNode', got 'None' instead. 有没有办法解决这个问题,或者是否有更好的方法来设计类构造函数?

python python-typing

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

先前函数调用中保留的函数参数中的默认值

我注意到 python 中有一个奇怪的行为,有人能给我这种行为的原因吗?

如果我调用没有属性的函数,则默认值将保留其状态。您可以查看以下示例以更好地理解

class EvenStream(object):
    def __init__(self):
        self.current = 0

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return


class OddStream(object):
    def __init__(self):
        self.current = 1

    def get_next(self):
        to_return = self.current
        self.current += 2
        return to_return


def print_from_stream(n, stream=EvenStream()):
    for _ in range(n):
        print(stream.get_next())


print_from_stream(2)
print('*****')
print_from_stream(2)
print('*****')
print_from_stream(2, OddStream())
print('*****')
print_from_stream(2, OddStream())
Run Code Online (Sandbox Code Playgroud)

输出:我期待 0,2,0,2 但它给了我 0,2,4,6

0
2
*****
4
6
*****
1
3
*****
1
3
Run Code Online (Sandbox Code Playgroud)

python python-3.x

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