小编r.o*_*ook的帖子

Python 3.x和Python 2.7中dict.values()和dict.keys()相等性之间的行为不一致

我发现,比较的结果keys()values()方法的dict内置在自己产生不一致的结果:

instance = {'one': 1}

instance.values() == instance.values() # Returns False
instance.keys() == instance.keys()     # Returns True
Run Code Online (Sandbox Code Playgroud)

在Python 2.7中运行上述代码将对两个调用都返回True,这使我相信Python 3的一些实现细节dict_values会导致这种奇怪的行为。

是否有这种行为的原因,或者我偶然发现了一些晦涩的错误?

python python-2.7 python-3.x

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

iter() 返回了“dict_items”类型的非迭代器

这让我发疯。下面是一个class我正在搞乱的,目标是有一种支持动态属性分配的方法。 请暂时忘记糟糕的实现或为什么我不只使用字典,我知道还有其他方法可以做到这一点(例如Enum)但这是我之前的测试代码,现在它成为我寻找原因的追求不工作。

class Family(object):
    def children(self):
        return self.__dict__.values()

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __getitem__(self, item):
        return self.__dict__[item]

    def __repr__(self):
        return str(self.__dict__)

    def __iter__(self):
        return self.__dict__.items()
Run Code Online (Sandbox Code Playgroud)

这一切看起来都很好,我启动了一个测试对象,如下所示:

foo = Family()
foo.a = 'foo'
foo.b = 'bar'

[i for i in foo]
Run Code Online (Sandbox Code Playgroud)

现在预期的结果是[('a', 'foo'), ('b', 'bar')],但我得到的是:

TypeError: iter() returned non-iterator of type 'dict_items'

我想我可能把__iter__方法搞砸了,所以我检查如下:

type(foo.__iter__())
# <class 'dict_items'>
type(foo.__dict__.items())
# <class 'dict_items'>

[i for i in foo.__dict.__items()]
# [('a', 'foo'), …
Run Code Online (Sandbox Code Playgroud)

python class python-3.x

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

当实例被销毁时,为什么tkinter不释放内存?

我想要一个快速而又脏的方法来获取一些文件名而无需在我的shell中输入,所以我有以下代码:

from tkinter.filedialog import askopenfile

file = askopenfile()
Run Code Online (Sandbox Code Playgroud)

现在,这一切工作正常,但它确实创造一个多余的tkinter,需要关闭GUI.我知道我可以这样做来压制它:

import tkinter as tk
tk.Tk().withdraw()    
Run Code Online (Sandbox Code Playgroud)

但这并不意味着它没有装在背上.它只是意味着现在有一个Tk()我无法关闭/销毁的对象.


所以这让我想到了真正的问题.

似乎每次我创建一个Tk(),无论我deldestroy()它,内存都没有被释放.见下文:

import tkinter as tk
import os, psutil
process = psutil.Process(os.getpid())
def mem(): print(f'{process.memory_info().rss:,}')

# initial memory usage
mem()

# 21,475,328
for i in range(20):
    root.append(tk.Tk())
    root[-1].destroy()
    mem()

# 24,952,832
# 26,251,264
# ...
# 47,591,424
# 48,865,280

# try deleting the root instead

del root
mem()

# 50,819,072
Run Code Online (Sandbox Code Playgroud)

正如所看到的,蟒蛇甚至没有的每个实例后腾出的使用Tk()被破坏和root小号删除.然而,这不是其他对象的情况: …

python memory tkinter psutil

5
推荐指数
2
解决办法
528
查看次数

如何在UserForm TextBox上强制执行Change()时保持光标位置?

假设我在EXCEL VBA UserForm中有以下代码:

Private Sub TextBox_Change()

TextBox.Value = UCase(TextBox.Value)

OtherText.Value = "FOO " & TextBox.value & " BAR"

End Sub
Run Code Online (Sandbox Code Playgroud)

它强制文本框始终为大写,并且当用户从末尾键入时效果很好.

然而,我说我得到了一个文本"HELLO WORLD",我想在其间插入 "CRUEL "(由用户手动输入),一旦我输入C,光标将跳转到后面D,最终结果将成为"HELLO CWORLDRUEL "(如果我盲目输入).

如果我有大写锁定,光标位置不会改变,但它会破坏代码的目的......并且使用小写字符它总是将光标踢到最后.

有没有办法保持这些类型的强制案例更改的光标位置?

我曾考虑使用_Exit()方法,但我确实希望每次更改都保持值OtherTextTextBox值大写.否则OtherText将全部为大写,而TextBox_Exit()执行之前仍然是小写,它看起来......不合需要.

excel controls vba userform uppercase

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

如果子字符串在字符串列表中,则返回字符串列表

我正在尝试进行一种不需要精确返回输出的列表查找。我希望能够输入任意数量的字母,然后让程序返回一个匹配的单词。

words=["apple","banana","orange"]
Run Code Online (Sandbox Code Playgroud)

如果用户输入“ng”,它将返回橙色。但是如果用户输入“an”,香蕉和橙子就会返回。“a”将返回此列表中的所有项目。我一直在尝试用谷歌搜索这个,但显然我没有提出正确的问题。任何帮助,将不胜感激

python list

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

标签 统计

python ×4

python-3.x ×2

class ×1

controls ×1

excel ×1

list ×1

memory ×1

psutil ×1

python-2.7 ×1

tkinter ×1

uppercase ×1

userform ×1

vba ×1