我注意到以下几点:
class c:
def __init__(self, data=[]):
self._data=data
a=c()
b=c()
a._data.append(1)
print b._data
[1]
Run Code Online (Sandbox Code Playgroud)
这是正确的行为吗?
想象一下我在javascript中有以下代码
function test(string) {
var string = string || 'defaultValue'
}
Run Code Online (Sandbox Code Playgroud)
启动可能未定义的变量的python 方法是什么?
我正在尝试编写一个python函数,在第一次调用时,返回1.在第二次调用时,返回2.在第三个,一个3.等等.
目前,我使用全局变量实现了这一目标:
index = 0
def foo():
global index
index += 1
return index
Run Code Online (Sandbox Code Playgroud)
调用该函数三次时:
print(foo())
print(foo())
print(foo())
Run Code Online (Sandbox Code Playgroud)
它返回预期的值:
1
2
3
Run Code Online (Sandbox Code Playgroud)
但是,我已经读过使用全局变量是不好的做法.所以,我想知道如果不使用全局变量可以实现相同的结果.
有什么建议吗?
谢谢您的帮助.
我在不知情的情况下不小心使用了可变的默认参数。
有没有可以发现这一点并警告我的 linter 或工具?
Python设计理念的一个想法是"应该有一个......明显的方法来实现它".(PEP 20),但这并非总是如此.我特别指的是(简单)if语句与布尔评估.考虑以下:
if words:
self.words = words
else:
self.words = {}
Run Code Online (Sandbox Code Playgroud)
与
self.words = words or {}
Run Code Online (Sandbox Code Playgroud)
在这样一个简单的情况下,从风格上说,这是更可取的吗?对于更复杂的情况,可以选择if语句以获得可读性,对吧?
可能重复:
Python中的"最小惊讶":可变默认参数
def f(a, L=[]):
L.append(a)
return L
print(f(1, [1, 2]))
print(f(1))
print(f(2))
print(f(3))
Run Code Online (Sandbox Code Playgroud)
我想知道为什么其他f(1),f(2),f(3)没有附加到第一个f(1,[1,2]).我想结果应该是:
[1, 2, 1]
[1, 2, 1, 1]
[1, 2, 1, 1, 2]
[1, 2, 1, 1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
但结果不是这个.我不知道为什么.
我有一个简单的Python脚本,它使用Ctl-C的信号处理程序.如果程序正常完成,则结束时间将传递到"print_results"函数中.我希望print_results函数有一个可选参数,如果没有传递,只需获取当前"现在"时间.但是当我从信号处理程序调用它时,它没有得到正确的时间.
这是我简化但可重复的程序:
import sys
import signal
import urllib2
import urllib
import datetime
import time
import getopt,sys
def signal_handler(signal, frame):
print_results()
sys.exit(0)
def print_results(ended=datetime.datetime.now()):
print "\nEnded at ",ended
print "Total time: ",(ended - startTime)
print "Finished ",numIterations," iterations, received ",totalRecords," records"
numIterations = 0
maxIterations = 8
delaySecs = 3
totalRecords = 0
# set up signal handler
signal.signal(signal.SIGINT, signal_handler)
startTime = datetime.datetime.now()
print "Starting at ",time.asctime(time.localtime())
while (numIterations < maxIterations):
iterStartTime = datetime.datetime.now()
numIterations += 1
print "Iteration: ",numIterations
# …Run Code Online (Sandbox Code Playgroud) [编辑00]:我已经多次编辑该帖子,现在甚至是标题,请阅读以下内容.
我只是了解了格式字符串的方法,其使用词典使用,如所提供的那些vars(),locals()和globals(),例如:
name = 'Ismael'
print 'My name is {name}.'.format(**vars())
Run Code Online (Sandbox Code Playgroud)
但是我想这样做:
name = 'Ismael'
print 'My name is {name}.' # Similar to ruby
Run Code Online (Sandbox Code Playgroud)
所以我想出了这个:
def mprint(string='', dictionary=globals()):
print string.format(**dictionary)
Run Code Online (Sandbox Code Playgroud)
您可以在此处与代码进行交互:http://labs.codecademy.com/BA0B/3#: workspace
最后,我想做的是将该函数放在另一个名为的文件中my_print.py,这样我就能做到:
from my_print import mprint
name= 'Ismael'
mprint('Hello! My name is {name}.')
Run Code Online (Sandbox Code Playgroud)
但就像现在一样,范围存在问题,我如何从导入的mprint函数中将主模块命名空间作为字典.(不是那个my_print.py)
我希望我自己理解,如果没有,尝试从另一个模块导入该功能.(回溯在链接中)
它正在访问globals()dict my_print.py,但当然变量名在该范围内没有定义,有关如何实现这一点的任何想法?
如果它在同一模块中定义,该函数可以工作,但请注意我必须如何使用,globals()因为如果不是,我只会得到一个mprint()范围内的值的字典.
我已经尝试使用非局部和点符号来访问主模块变量,但我仍然无法弄明白.
[编辑01]:我想我找到了一个解决方案:
在my_print.py中:
def mprint(string='',dictionary=None):
if dictionary is None:
import sys …Run Code Online (Sandbox Code Playgroud) 我通读了有关插槽使用的主要答案,它让我了解了如何以及在何处使用__slots__.
现在,我将代码从 Python 2 移植到 Python 3,类似于以下内容:
class B(object):
__slots__ = ('_fields')
_fields = set()
Run Code Online (Sandbox Code Playgroud)
但这会在 Python 2 上正常工作时给出错误 Python 3:
ValueError: '_fields' in __slots__ conflicts with class variable.
我将代码更改为
class B(object):
__slots__ = ('_fields')
def __init__(self):
_fields = set()
Run Code Online (Sandbox Code Playgroud)
它工作正常。我的疑问是,它甚至是正确的更改吗?
正如我从原始代码中得到的,我猜它是说不要__dict__用于节省内存或更快的访问或任何原因,但同时也试图将属性类型指定_field为 set()。上面的更改是否是正确的表达方式,或者它可能会产生一些副作用。
进一步实验:我进一步实验了以下变体(在 Python 3 上):
import pdb
class A(object):
a = set()
'''
class B(object):
__slots__ = ('a')
a = set()
'''
class C(object):
__slots__ = ('a')
def …Run Code Online (Sandbox Code Playgroud) 函数的预期目标foo是将作为参数提供的数字添加到列表中,如果它为0,则重置列表.首先我写了这个程序:
def foo(n, bar = []):
if n == 0:
bar = []
print("list empty")
else:
bar.append(n)
for y in bar:
print(y, end=', ')
print()
foo(5)
foo(3)
foo(0)
foo(6)
Run Code Online (Sandbox Code Playgroud)
输出:
5,
5, 3,
list empty
5, 3, 6,
Run Code Online (Sandbox Code Playgroud)
但它看起来像bar = []被忽略了.然后我改变bar = []了bar.clear(),它按照我的想法运作:
def foo(n, bar = []):
if n == 0:
bar.clear()
print("list empty")
else:
bar.append(n)
for y in bar:
print(y, end=', ')
print()
foo(5)
foo(3)
foo(0)
foo(6)
Run Code Online (Sandbox Code Playgroud)
输出:
5,
5, …Run Code Online (Sandbox Code Playgroud) python ×10
coding-style ×1
datetime ×1
function ×1
if-statement ×1
increment ×1
javascript ×1
parameters ×1
python-3.x ×1
slots ×1
undefined ×1