파이썬 목록 수정 및 가변 재 할당 : 기능 범위 깊이 분석
Python 프로그래밍, 특히 목록과 같은 변이 가능한 객체를 처리 할 때 개발자는 종종 문제가 발생합니다. 함수 내부 목록에서 작동 한 후 기능 외부 목록은 예상대로 변경되지 않은 것 같습니다. 이는 일반적으로 Python 변수 할당, 객체 참조 및 장소 수정 메커니즘에 대한 이해가 충분하지 않습니다. 이 기사는 특정 병합 분류 목록 케이스를 통해이 현상을 깊이 분석하고 두 가지 명확한 솔루션을 제공합니다.
문제 분석 : 가변 재 할당 및 현장 수정
다음 코드 스 니펫을 고려하십시오. 목표는 NUMS2의 내용을 NUMS1로 병합하고 NUMS1을 정렬하는 것이 목표이며 "값을 반환하지 않고 NUMS1을 수정하십시오":
입력 가져 오기 목록에서 def merge_problematic (nums1 : list [int], m : int, nums2 : list [int], n : int) -> none : "" " 아무것도 반환하지 말고 대신 내면에서 NUMS1을 수정하십시오. "" " mn == m : # nums1 = nums2 m == 0 else nums1 # 이것은 재 할당되지만 후속 논리와 관련이 없습니다. Pass #이 지점에 입력하지 않는다고 가정하면 처리를 단순화하십시오. # 문제의 요점 : 새 목록 객체가 여기에 생성되어 로컬 변수 NUMS1에 할당됩니다 1 nums1 = nums1 [: m] nums2 print ( '내부 기능 (정렬 전), nums1 :', nums1) # 새 로컬 목록 인쇄 숫자 ( '내부 함수 (내부 기능), nums1 :', nums1) # 정렬 후 새 로컬 목록을 인쇄 # nums1_original = [1,2,0,0,0,0] NUMS2_Example = [2,5,6] m_val, n_val = 3, 3 print ( '기능 호출 전, nums1_original :', nums1_original) MERGE_PROBLEMATIC (NUMS1_ORIGINAL, M_VAL, NUMS2_EXALLE, N_VAL) print ( '기능 호출 후, nums1_original :', nums1_original) # found nums1_original이 변경되지 않음
위의 코드를 실행하면 MERGE_PROBLEMATIC 함수 내부의 NUMS1의 수정 (병합 및 정렬)이 함수 외부의 NUMS1_ORIGINAL에 반영되지 않음을 알 수 있습니다. 이것은 다른 분기에서 명령문 nums1 = nums1 [: m] nums2가 다음을 수행하기 때문에 다음을 수행하기 때문입니다.
- NUMS1 [: M] NUMS2는 병합 된 요소를 포함하는 새 목록 개체를 만듭니다.
- 이 새 목록 개체는 함수 내부의 로컬 변수 NUMS1 에 할당됩니다.
이는 함수 내에서 로컬 변수 NUMS1이 더 이상 원래 목록 객체 NUMS1_ORIGINAL을 가리키지 않고 새로 생성 된 목록을 가리키는 것을 의미합니다. 후속 NUMS1.SORT () 작업은이 새로운 로컬 목록을 정렬하는 것입니다. 함수가 실행 된 후, 로컬 변수와 새로운 목록이 파괴되는 반면, 함수 외부의 NUMS1_ORIGINAL 변수는 여전히 원래 목록 개체를 가리키므로 변경되지 않은 것 같습니다.
솔루션 1 : 실제 현실 수정
함수 문자 문자열에 명시 적으로 "NUMS1을 수정"해야하는 경우, 새 목록을 작성하고 값을 재 할당하는 대신 작업이 들어오는 목록 객체에서 직접 작동하는지 확인해야합니다. 현장 수정을 구현하기위한 열쇠는 목록 메소드 (예 : extend (), append (), sort ()) 또는 슬라이스 할당 (list [:] = ...)를 사용하는 것입니다.
다음은 슬라이스 할당을 사용하여 현장 수정을 구현하는 예입니다.
입력 가져 오기 목록에서 def merge_in_place (nums1 : list [int], m : int, nums2 : list [int], n : int) -> none : "" " 아무것도 반환하지 말고 대신 내면에서 NUMS1을 수정하십시오. "" " # nums1의 유효한 부분을 지우고 # nums1 [: m] = [] # 선택 사항을 채 웁니다. nums1 [: m]에 Nums1 [: m] 이후에 유지되어야하는 0이 있으면 병합 된 목록 내용을 구성 할 필요가 없습니다. merged_content = nums1 [: m] nums2 [: n] # n의 유효 길이도 여기에서 고려된다는 점에 유의하십시오. # 슬라이스 할당을 사용하여 NUMS1의 전체 범위에 새 컨텐츠를 할당# NUMS1 내부의 모든 요소를 대체하지만 NUMS1 객체 자체의 참조 자체를 변경하지 않은 NUMS1 [:] = MERGED_CONTENT를 유지합니다. # 정렬 NUMS1 in SICT NUMS1.SORT () # 예제 전화 번호 1_original_inplace = [1,2,3,0,0,0] NUMS2_EXALLE_INPLAPE = [2,5,6] m_val, n_val = 3, 3 print ( '기능 호출 전 (내면), nums1_original_inplace :', nums1_original_inplace) merge_in_place (nums1_original_inplace, m_val, nums2_example_inplace, n_val) print ( '기능 호출 후 (내면), nums1_original_inplace :', nums1_original_inplace) # 예상 출력 : [1, 2, 2, 3, 5, 6]
이 merge_in_place 함수에서 nums1 [:] = merged_content가 키입니다. NUMS1 변수에 새 목록 객체를 할당하는 대신 MERGED_CONTENT 목록의 모든 요소를 NUMS1에 의해 가리키는 원래 목록 객체 로 복사하고 대체합니다. 이런 식으로, NUMS1_ORIGINAL_INPLACE 변수는 여전히 동일한 목록 객체를 가리키지 만 개체의 내용이 수정되었습니다. 후속 NUMS1.SORT ()는이 수정 된 원본 목록에서 직접 작용합니다.
해결책 2 : 새 목록을 작성하고 반환합니다
함수의 목적이이를 수정하는 것이 아니라 새로운 병합 및 정렬 된 목록을 생성하는 경우 가장 명확하고 가장 간단한 방법은 새 목록을 작성하여 반환하는 것입니다. 이는 부작용을 피하고 코드를 이해하고 디버그하기 쉽게 만들기 때문에 파이썬에서 데이터를 처리하기위한 일반적이고 권장되는 패턴입니다.
이 방법의 구현은 다음과 같습니다.
입력 가져 오기 목록에서 def merge_and_return_new_list (nums1 : list [int], m : int, nums2 : list [int], n : int) -> list [int] : "" " NUMS1 및 NUMS2를 병합 한 다음 새 목록을 정렬하고 반환합니다. NUMS1 또는 NUMS2 내에서 수정하지 않습니다. "" " # NUMS1 및 NUMS2의 효과적인 부분을 추출합니다. Effectio_Nums1 = NUMS1 [: M] explud_nums2 = nums2 [: n] # 두 목록을 병합하고 새 목록 작성 new_list = explue_nums1 explic_nums2 # 새 목록 정렬# sorted () 함수 원본 목록을 수정하지 않고 새 정렬 된 목록을 반환합니다. Sorted_new_list를 반환합니다 # 예제 전화 번호 1_for_new = [1,2,3,0,0,0] NUMS2_FOR_NEW = [2,5,6] m_val, n_val = 3, 3 print ( '기능 호출 전 (새로운 반환), nums1_for_new :', nums1_for_new) result_list = merge_and_return_new_list (nums1_for_new, m_val, nums2_for_new, n_val) print ( 'function call (return new), nums1_for_new :', nums1_for_new) # 변경되지 않은 인쇄를 남기십시오 ( '반환 된 병합 및 정렬 된 목록 :', result_list) # 예상 출력 : [1, 2, 2, 3, 5, 6]
이 방법은 간단하고 간단합니다. 함수는 입력을 수신하고 결과를 계산하며 결과를 새로운 목록으로 반환합니다. 원래 NUMS1 및 NUMS2 목록은 기능 호출 전후에 변경되지 않은 상태로 유지됩니다. 이 "순수한 기능"스타일은 코드의 복잡성과 잠재적 부작용을 줄이기 때문에 많은 시나리오에서 더 인기가 있습니다.
요약 및 모범 사례
Python에서 가변 할당과 객체 참조의 차이를 이해하는 것은 정확하고 유지 관리 가능한 코드를 작성하는 데 중요합니다.
- 가변 할당 (var = value) : 함수 내부의 매개 변수로 전달 된 목록에서 var = new_list와 같은 할당 작업을 수행하면 로컬 변수가 함수 외부에 전달 된 원래 목록 객체에 영향을 미치지 않으면 서 로컬 변수가 새 목록 개체를 가리 키게됩니다.
- 제자리에 수정 (list.method () 또는 list [:] = ...) : 전달 된 목록 객체를 실제로 수정하려면 (예 : append (), extend (), sort ()) 또는 슬라이스 할당 (list [:] = new_content)를 사용해야합니다. 이러한 작업은 변수가 가리키는 객체 자체를 변경하지 않고 목록 객체의 내용을 직접 수정합니다.
기능을 설계 할 때는 귀하의 요구에 따라 명확하게하십시오.
- 들어오는 목록을 현장에서 수정 해야하는 경우 : 목록 내용을 조작하기 위해 목록 메소드 또는 슬라이스 할당을 사용해야합니다.
- 새 목록을 반환 할 수있는 경우 : 일반적으로 외부 상태에 대한 예기치 않은 수정을 피하기 때문에 새 목록을 작성하고 반환하는 것이 더 명확하고 안전합니다.
선택할 방법은 특정 기능 설계 요구 사항 및 컨텍스트에 따라 다릅니다. 이 두 가지 메커니즘에 대한 명확한 이해는 일반적인 Python 목록 작동 트랩을 피하는 데 도움이됩니다.
위 내용은 파이썬 목록 수정 및 가변 재 할당 : 기능 범위 깊이 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT
더 현명한 결정을 위한 AI 기반 투자 연구

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

종속성 패키지를 설치하려면 pipinstall-rrequirements.txt를 실행하십시오. 충돌을 피하고, 파일 경로가 올바른지 확인하고 PIP가 업데이트되었는지 확인하고 필요한 경우 설치 동작을 조정하기 위해-no-deps 또는 --user와 같은 옵션을 사용하는 것이 좋습니다.

이 튜토리얼은 PEFT LORA 어댑터를 기본 모델과 효율적으로 병합하여 완전히 독립적 인 모델을 생성하는 방법을 자세히 설명합니다. 이 기사는 변압기를 직접 사용하는 것이 잘못되었음을 지적합니다. Aumodel은 어댑터를로드하고 가중치를 수동으로 병합하고 PEFT 라이브러리에서 MERGE_AND_UNLOAD 방법을 사용하는 올바른 프로세스를 제공합니다. 또한 튜토리얼은 워드 세그먼트를 다루는 것의 중요성을 강조하고 PEFT 버전 호환성 문제 및 솔루션에 대해 설명합니다.

Python은 Python의 간단하고 강력한 테스트 도구입니다. 설치 후 테스트 파일은 이름 지정 규칙에 따라 자동으로 발견됩니다. 어설 션 테스트를 위해 test_로 시작하여 기능을 작성하고 @pytest.fixture를 사용하여 재사용 가능한 테스트 데이터를 생성하고 pytest.raises를 통해 예외를 확인하고 지정된 테스트 실행 및 여러 명령 줄 옵션을 지원하며 테스트 효율성을 향상시킵니다.

theargparsemoduleisecomedendedway handlecommand-lineargumentsinpython, robustparsing, typevalidation, helpmessages, anderrorhandling; audys.argvforsimplecaseSrequiringMinimalSetup을 제공합니다.

이 기사는 Python과 Numpy의 부동 소수점 수의 부동 소수 계산 정확도의 일반적인 문제를 탐색하는 것을 목표로하며, 근본 원인은 표준 64 비트 플로팅 포인트 수의 표현 제한에 있다고 설명합니다. 더 높은 정확도가 필요한 컴퓨팅 시나리오의 경우,이 기사는 독자가 복잡한 정확도 요구를 해결하기위한 올바른 도구를 선택할 수 있도록 MPMATH, Sympy 및 GMPY와 같은 고정밀 수학 라이브러리의 사용 방법, 기능 및 해당 시나리오를 소개하고 비교합니다.

PYPDF2, PDFPLAMBER 및 FPDF는 Python이 PDF를 처리하기위한 핵심 라이브러리입니다. PYPDF2를 사용하여 PDFREADER를 통해 페이지를 읽고 extract_text ()를 호출하려면 텍스트 추출, 병합, 분할 및 암호화를 수행하십시오. PDFPlumber는 레이아웃 텍스트 추출 및 테이블 인식을 유지하는 데 더 적합하며 TABLE 데이터를 정확하게 캡처하기 위해 Extract_Tables ()를 지원합니다. FPDF (권장 FPDF2)는 PDF를 생성하는 데 사용되며 문서는 add_page (), set_font () 및 cell ()을 통해 구축 및 출력됩니다. pdfs를 병합 할 때 pdfwriter의 append () 메소드는 여러 파일을 통합 할 수 있습니다.

import@contextManagerFromContextLibandDefineAgeneratorFunctionThatYieldSActlyOnce, whereCodeBeforeYieldActSasEnterAndErandCodeftertyield (바람직하게는) ACTSAS__EXIT __

현재 시간을 얻는 것은 DateTime 모듈을 통해 Python에서 구현할 수 있습니다. 1. DateTime.now ()를 사용하여 로컬 현재 시간을 얻으십시오. utcnow () 및 일일 작업은 Datetime.now ()를 형식의 문자열과 결합하여 요구를 충족시킬 수 있습니다.
