在我的节目中遇到了这种奇怪.这是一个麻烦的部分片段:
#!/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函数是静态的,因为它们保留了后续调用中传递给它们的值,或者我在代码中遗漏了什么?
我需要创建一个n个索引为1的列表,然后在一行代码中创建一个10(它必须在一行上在线提交).我试过:(n*[1]).append(10)但是返回一个None类型.这可行吗?谢谢.
#! /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
我有以下递归函数
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中的代码,它创建了由Bond和Element对象组成的Compound对象(如化合物).这些Element对象是通过一些关于它们的输入(名称,符号,原子序数,原子质量等)创建的.如果我想用Element对象填充数组,并且我希望Element对象是唯一的,那么我可以做一些事情并保持其余部分不变,但是它们都应该具有与'Hydrogen'元素相关的信息.
这个问题Python为单个对象/类创建多个实例让我相信我应该为Element创建子类 - 即Hydrogen对象和Carbon对象等.
这是否可以在不创建子类的情况下实现,如果是这样,怎么办?
我有一个代码,其中我想,让用户通过标准输入三个值,每种类型的float,Fraction或者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 的初学者,所以鼓励任何告诉我如何改进我的代码的评论。
我正在编写一种计算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) 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 类型注释创建树结构。代码是这样的:
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 中有一个奇怪的行为,有人能给我这种行为的原因吗?
如果我调用没有属性的函数,则默认值将保留其状态。您可以查看以下示例以更好地理解
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)