小编Ben*_*tte的帖子

函数结果与可变默认参数的串联

假设一个函数具有可变的默认参数:

def f(l=[]):
    l.append(len(l))
    return l
Run Code Online (Sandbox Code Playgroud)

如果我运行此命令:

def f(l=[]):
    l.append(len(l))
    return l
print(f()+["-"]+f()+["-"]+f()) # -> [0, '-', 0, 1, '-', 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

或这个:

def f(l=[]):
    l.append(len(l))
    return l
print(f()+f()+f()) # -> [0, 1, 0, 1, 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

代替以下内容,这将更合乎逻辑:

print(f()+f()+f()) # -> [0, 0, 1, 0, 1, 2]
Run Code Online (Sandbox Code Playgroud)

为什么?

python python-3.x

47
推荐指数
2
解决办法
1246
查看次数

删除list-of-list中的共享引用?

好的,让我用一个简单的例子来解释这个问题:

l = [[0]]*3       # makes the array [[0], [0], [0]]
l[0][0] = 42      # l becomes [[42], [42], [42]]
from copy import deepcopy
m = deepcopy(l)   # m becomes [[42], [42], [42]]
m[0][0] = 2       # m becomes [[2], [2], [2]]
Run Code Online (Sandbox Code Playgroud)

这是一个基本的共享参考问题.除了通常情况,当发生这样的问题时,deepcopy我们的朋友.目前,我这样做是为了解决我的deepcopy背叛问题:

l = [[0]]*3       # makes the array [[0], [0], [0]]
import JSON
m = JSON.loads(JSON.dumps(l)) # m becomes [[0], [0], [0]] with no self references
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种效率较低且不那么愚蠢的处理自共享引用的方法.

当然我不会故意制作这样的数组,但是我需要处理有人给我的代码一个的情况.在大型阵列上运行我的"解决方案"很慢,而且我有很多级别的嵌套数组,我不能为这些野兽制作这么大的字符串.

python reference deep-copy nested-lists

18
推荐指数
2
解决办法
674
查看次数

分配表达式如何`:=`在Python中工作?

我已经阅读了关于赋值表达式的PEP 572,我发现这个代码是一个明确的例子,我可以使用它:

while line := fp.readline():
    do_stuff(line)
Run Code Online (Sandbox Code Playgroud)

但我很困惑,从我读到的,它应该像正常的赋值一样工作,但返回值.但它看起来不像那样:

>>> w:=1
  File "<stdin>", line 1
    w:=1
     ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

在修补它之后,我意识到以下工作:

>>> (w:=1)
1
Run Code Online (Sandbox Code Playgroud)

但它感觉如此不熟悉.它是唯一需要括号的运算符:

>>> w = 1
>>> w + w
2
>>> w == w
True
>>> w is w
True
>>> w < w
False
Run Code Online (Sandbox Code Playgroud)

它是否有理由被解析器与Python中的其他任何东西区别对待?我觉得我错过了什么.这不仅仅是一个运营商.

:=在REPL中使用以指定变量将非常有用,因为将显示该值.


(更新:我不鼓励对这个敏感话题进行固执讨论.请避免发表评论或答案,而不是有用的评论.)

python python-3.8

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

如何修复“oh-my-zsh 插件‘docker’,未找到”

当我启动我得到了这个:

[oh-my-zsh] plugin 'docker,' not found
Run Code Online (Sandbox Code Playgroud)

.zshrc看起来像这样:

plugins=(
  docker,
  docker-compose,
  git
)
Run Code Online (Sandbox Code Playgroud)

oh-my-zsh

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

试图理解一些f-string魔法(格式化f-string中的迷你语言)

这篇文章的评论中,有人放弃了这行代码:

print("\n".join(f'{a:{a}<{a}}' for a in range(1,10)))
Run Code Online (Sandbox Code Playgroud)
1
22
333
4444
55555
666666
7777777
88888888
999999999
Run Code Online (Sandbox Code Playgroud)

它对我来说看起来很神奇,有人可以向我解释它为什么有效(更具体地说f'{a:{a}<{a}}').

python python-3.x f-string

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