class SortedDict(dict):
def __init__(self, data=None):
if data is None:
data = {}
super(SortedDict, self).__init__(data)
Run Code Online (Sandbox Code Playgroud)
和
class SortedDict(dict):
def __init__(self, data={}):
dict(data)
Run Code Online (Sandbox Code Playgroud)
我认为他们是一样的.
对于A类,为什么在对象和对象b之间共享aMap成员变量?
>>> class A:
... aMap = {}
>>> a = A()
>>> a.aMap["hello"] = 1
>>> b = A()
>>> b.aMap["world"] = 2
>>> c = []
>>> c.append(a)
>>> c.append(b)
>>> for i in c:
... for j in i.aMap.items():
... print j
('world', 2)
('hello', 1)
('world', 2)
('hello', 1)
Run Code Online (Sandbox Code Playgroud) 码:
class Node:
def __init__(self, key, children=[]):
self.key = key
self.children = children
def __repr__(self):
return self.key
Run Code Online (Sandbox Code Playgroud)
执行:
root = Node("root")
child = Node("child")
root.children.append(child)
print child.children
print root.children[0].children
Run Code Online (Sandbox Code Playgroud)
结果:
[child]
[child]
Run Code Online (Sandbox Code Playgroud)
这真的很奇怪,为什么?
Python的版本是2.7.2.
matrix = [[0]*1005]*1005
Run Code Online (Sandbox Code Playgroud)
和
matrix = [[0 for _ in range(1005)] for _ in range(1005)]
Run Code Online (Sandbox Code Playgroud)
我发现如果我使用前者初始数组,并运行matrix[1][1] = 1它将每行中的第二列设置为1.第二列按照我的意愿执行.我想不通为什么?
我需要创建一个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)