我只有一小段代码,并且有一个很大的疑问。
s=['a','+','b']
s1=s
print s1
del s1[1]
print s1
print s
Run Code Online (Sandbox Code Playgroud)
输出是
value of s1 ['a', '+', 'b']
value of s1 ['a', 'b']
value of s ['a', 'b']
Run Code Online (Sandbox Code Playgroud)
为什么我单独修改s1时变量's'的值会改变?我怎样才能解决这个问题?
先感谢您 :)
好吧,我是Python的新手,有些东西让我对切片列表感到烦恼.当我从这段代码中切割[1]和[3]时,为什么我得到[1,3,4]?
z = [1, 2, 3, 4, 5]
del z[1], z[3]
print z
Run Code Online (Sandbox Code Playgroud)
我假设我会[[1,3,5]回来,因为看起来[2]和[4]被删除了.
如果 - > [1,2,3,4,5]
是 - > [0,1,2,3,4]
我的逻辑搞砸了哪里?
有史以来第一个问题,对不起,如果有人问过 - 我做了搜索,但我找不到任何似乎回答它的东西.
我一直试图理解python __del__方法的行为,因为我需要它来对包装的C代码执行一些清理.
我的理解__del__是当对象的引用计数达到零时del调用,而不是在对象引用上调用时调用.这让我相信实例化一个没有赋值的对象会在__init__之后__del__立即调用,但事实并非如此,如下面的代码所示:
class Foo():
def __init__(self):
print "Hello"
def __del__(self):
print "Goodbye"
Foo()
Hello
<__main__.Foo instance at 0x7fb943075a28>
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这里发生了什么?提前致谢.
我有一个脚本,实例化了许多子对象.当脚本(和这些对象)结束时......对象需要做一些清理(尤其是临时文件关闭和删除).
我一直在阅读如何__del__不可靠 - 但是上下文管理似乎不起作用,子对象不会持久.他们需要四处闲逛(做文件读写等事情)
一个例子:
WRITER.PY
import os
class Writer(object):
def __init__(self, filename):
self.filename = filename
self.open()
def open(self):
self.fh = open(self.filename, "w+", 0)
def write(self, msg):
print >>self.fh, str(msg)
def close(self):
self.fh.close()
os.remove(self.filename)
def __enter__(self):
print "entered"
# self.open()
def __exit__(self, type, value, traceback):
print "__exit__"
self.close()
Run Code Online (Sandbox Code Playgroud)
MAIN.PY
def myfunc(filename):
with WRITER.Writer(filename) as writeit:
# do some stuff
writeit.write("hallo")
# do some more stuff
writeit.write("more results")
# even more stuff
writeit.write("goodbye")
Run Code Online (Sandbox Code Playgroud)
但是当我运行时myfunc(),对象一旦完成就会被垃圾收集__init__().它直接从enter到exit并且在with语句之后不执行任何任务.如果我把开放放入__init__ …
我在 Windows 10 上使用 Python 3.8.2。
我有以下代码:
x = range(5)
for i in x:
print(i)
del x
Run Code Online (Sandbox Code Playgroud)
预期输出:
0
Traceback (most recent call last):
File "C:\Users\Students\test.py", line 3, in <module>
for i in x:
NameError: name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)
实际输出:
0
1
Traceback (most recent call last):
File "C:\Users\Students\test.py", line 5, in <module>
del x
NameError: name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)
在第一次迭代中,我期望del x会删除,x以便在第二次迭代中它会给我行错误,for i in x:.
然而,它不断迭代,打印出1,然后给我错误提示,del x。
看起来它对任何可迭代对象的工作方式都是相同的。我用字典、集合、元组和列表进行了测试。 …
我正在构建一个待办事项列表 CLI,它需要一个del参数来从列表中删除一个条目。CLI 用法如下所示
$ ./todo help
Usage :-
$ ./todo add "todo item" # Add a new todo
$ ./todo ls # Show remaining todos
$ ./todo del NUMBER # Delete a todo
$ ./todo done NUMBER # Complete a todo
$ ./todo help # Show usage
$ ./todo report # Statistics
Run Code Online (Sandbox Code Playgroud)
但是在python(我使用的是python 3.8.3)中,当使用argparse模块从命令行解析参数时,上述指定功能的代码如下
parser.add_argument("--del", type=int, help="Delete a todo")
出现问题是因为 del 是 python 的保留关键字,用于完全不同的目的,因此在读取该行代码时会出现语法错误
print (args.del)
错误信息如下
File "todo.py", line 24
if args.del:
^
SyntaxError: invalid syntax …Run Code Online (Sandbox Code Playgroud) I have a class that starts a thread in its __init__ member and I would like join that thread when the instance of that class is not needed anymore, so I implemented that clean-up code in __del__.
It turns out that the __del__ member is never called when the last reference of the instance gets deleted, however if I implicitly call del, it gets called.
Below is a shorter modified version of my implementation that shows the issue. …
我得到了引用计数的概念
所以,当我执行"del astrd"时,引用计数降为零,astrd被gc收集?
这是示例代码.这些代码是我在昨天的问题之后开发的:链接文本
one.py:
def abc():
print "Hello"
print "123"
print '345'
Run Code Online (Sandbox Code Playgroud)
two.py:
import one
#reload(one)
#def defg():
one.abc()
Run Code Online (Sandbox Code Playgroud)
three.py:
import os,sys,gc
from time import sleep
import two
#reload(two)
#two.defg()
sleep(20)
directory = os.listdir('.')
for filename in directory:
if filename[-3:] == 'pyc':
print '- ' + filename
print sys.getrefcount(filename)
file_name = os.path.splitext (filename)[0]
del file_name # remove the local reference
del sys.modules[os.path.splitext (filename)[0]] # removes import
gc.collect() # garbage collect
#del sys.modules[filename]
#del filename
#os.remove(filename)
Run Code Online (Sandbox Code Playgroud)
我在three.py中所做的是对还是不对?有没有必要的步骤?如果是,为什么?
请帮我解决这个问题.
我有下一个代码(这里我尝试捕获最后一个对象):
class Mogican(object):
last = None
def __init__(self, name):
# print("Created")
self.name = name
self.prev = None
self.next = None
if self.__class__.last == None:
self.__class__.last = self
self.prev = None
self.next = None
else:
self.prev = self.__class__.last
self.__class__.last.next = self
self.__class__.last = self
self.next = None
def __del__(self):
print("Deleted")
if self.next == None:
print("here")
self.__class__.last = self.prev
self.prev.next = None
else:
print("no here")
self.prev.next = self.next
self.next.prev = self.prev
Run Code Online (Sandbox Code Playgroud)
我的主文件main.py:
from Mogican import Mogican
if __name__ == '__main__':
m1 = …Run Code Online (Sandbox Code Playgroud) 这是一个非常棘手的问题需要解释.我正在玩Python的列表方法,特别是del索引对象.我想创建一个简单的脚本,它将创建一个从1到100的整数列表,然后是一个for循环,它将从列表中删除奇数.
这是我写的脚本:
def main():
num = list(range(1,101))
print(num)
for i in range(0,101):
del num[i]
print(num)
main()
Run Code Online (Sandbox Code Playgroud)
好像它会起作用吗?我也这么认为,直到我跑了.
我不知道为什么,但是当i传递给del num[i]索引时,数字本身翻了一番.
当我跑的时候,我收到了IndexError: list assignment index out of range.
当我从改变的参数range(0,101)来range(0,10),我发现它删除了所有的奇数从1到20.
换句话说,i在索引加倍时它不应该.我能获得一些有关此事的信息吗?