标签: del

为什么两个变量的值在Python中都会改变?

我只有一小段代码,并且有一个很大的疑问。

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 variable-assignment del

2
推荐指数
1
解决办法
7337
查看次数

在Python中切片列表混乱

好吧,我是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 list slice del

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

__del__在未分配的python对象上的行为

有史以来第一个问题,对不起,如果有人问过 - 我做了搜索,但我找不到任何似乎回答它的东西.

我一直试图理解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)

谁能解释一下这里发生了什么?提前致谢.

python reference-counting del

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

__del__是不可靠的,但如果我尝试使用上下文管理器,则该对象不会持久存在

我有一个脚本,实例化了许多子对象.当脚本(和这些对象)结束时......对象需要做一些清理(尤其是临时文件关闭和删除).

我一直在阅读如何__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__ …

python with-statement del resource-cleanup contextmanager

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

为什么删除对可迭代对象的引用后循环会迭代?

我在 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
看起来它对任何可迭代对象的工作方式都是相同的。我用字典、集合、元组和列表进行了测试。 …

python loops reference del python-3.x

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

用作变量名时的Python“del”语法错误

我正在构建一个待办事项列表 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)

python del argparse python-3.x

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

当对象的最后一个引用被删除时,不会隐式调用 __del__

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. …

python multithreading del

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

sys.getrefcount继续

链接文字

我得到了引用计数的概念

所以,当我执行"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中所做的是对还是不对?有没有必要的步骤?如果是,为什么?

请帮我解决这个问题.

python del

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

Python对象不会被删除

我有下一个代码(这里我尝试捕获最后一个对象):

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 methods del

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

Python:列出循环删除故障的索引

这是一个非常棘手的问题需要解释.我正在玩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在索引加倍时它不应该.我能获得一些有关此事的信息吗?

python indexing for-loop list del

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